* [meta-oe][PATCH] libnih: Remove
@ 2020-01-09 20:33 Adrian Bunk
2020-01-09 21:49 ` Khem Raj
2020-01-15 10:15 ` Adrian Bunk
0 siblings, 2 replies; 5+ messages in thread
From: Adrian Bunk @ 2020-01-09 20:33 UTC (permalink / raw)
To: openembedded-devel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 942967 bytes --]
The main user was upstart, which is no longer provided
by any maintained layer.
Signed-off-by: Adrian Bunk <bunk@stusta.de>
---
.../packagegroups/packagegroup-meta-oe.bb | 2 +-
...files-also-make-it-work-with-latest-.patch | 24310 ----------------
...and-SIGCHILD-are-same-on-sytem-V-sys.patch | 28 -
.../libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch | 3593 ---
.../recipes-support/libnih/libnih_1.0.3.bb | 48 -
5 files changed, 1 insertion(+), 27980 deletions(-)
delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
delete mode 100644 meta-oe/recipes-support/libnih/libnih_1.0.3.bb
diff --git a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
index 31c3f4e95..ad968ddf9 100644
--- a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
+++ b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
@@ -236,7 +236,7 @@ RDEPENDS_packagegroup-meta-oe-support ="\
libinih inotify-tools joe lcms lcov libatasmart libbytesize \
libcereal libcyusbserial libee libeigen libestr libftdi libgit2 \
libgpiod libiio libjs-jquery libjs-sizzle liblinebreak libmicrohttpd \
- libmxml libnih liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
+ libmxml liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
libssh libtar libteam libtinyxml2 libtinyxml libusbg libusb-compat libutempter \
links lio-utils lockdev log4c log4cpp logwarn libdevmapper lvm2 \
mailcap mbuffer mg minini \
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
deleted file mode 100644
index 2c857c26f..000000000
--- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
+++ /dev/null
@@ -1,24310 +0,0 @@
-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;
--}
--
--\f
--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;
--}
--\f
--/* 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
--
--\f
--
--#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 */
--\f
--
--/*-----------------------------------------------.
--| 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/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
deleted file mode 100644
index a43b4b176..000000000
--- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From f1b9992caf9910f9f7afae401045e42572cc84ff Mon Sep 17 00:00:00 2001
-From: Khem Raj <raj.khem@gmail.com>
-Date: Sat, 1 Apr 2017 08:50:35 -0700
-Subject: [PATCH] signal.c: SIGCLD and SIGCHILD are same on sytem V systems
-
-Musl drops the SIGCLD legacy
-
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
----
- nih/signal.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/nih/signal.c b/nih/signal.c
-index a241df9..691c8e6 100644
---- a/nih/signal.c
-+++ b/nih/signal.c
-@@ -87,7 +87,7 @@ static const SignalName signal_names[] = {
- { SIGSTKFLT, "STKFLT" },
- #endif
- { SIGCHLD, "CHLD" },
-- { SIGCLD, "CLD" },
-+ { SIGCHLD, "CLD" },
- { SIGCONT, "CONT" },
- { SIGSTOP, "STOP" },
- { SIGTSTP, "TSTP" },
---
-2.12.1
-
diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
deleted file mode 100644
index 5d125c851..000000000
--- a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
+++ /dev/null
@@ -1,3593 +0,0 @@
---- libnih-1.0.3.orig/ChangeLog
-+++ libnih-1.0.3/ChangeLog
-@@ -1,3 +1,84 @@
-+2013-03-13 Steve Langasek <steve.langasek@ubuntu.com>
-+
-+ * nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
-+ passed to nih_dir_walk_scan() to ensure the nih_watch_new() filter
-+ function is passed the NihWatch data rather than the data passed to
-+ the nih_dir_walk() NihFileVisitor function (LP: #776532).
-+
-+ * nih/tests/test_watch.c (test_new): New test "with filter and data"
-+ to ensure filter is passed correct value.
-+
-+2013-02-28 James Hunt <james.hunt@ubuntu.com>
-+
-+ * Removal of gcc 'malloc' function attribute resulting from
-+ a clarification in its description which makes its use invalid.
-+ (LP: #1123588).
-+
-+2013-02-05 James Hunt <james.hunt@ubuntu.com>
-+
-+ * nih/logging.c: nih_log_abort_message(): Remove erroneous check
-+ left over from use of __abort_msg weak symbol.
-+ * nih/tests/test_logging.c: Remove unecessary check on whether
-+ __nih_abort_msg has an address.
-+
-+2012-12-13 Stéphane Graber <stgraber@ubuntu.com>
-+
-+ * nih-dbus-tool/type.c, nih-dbus-tool/marshal.c: Update dbus code
-+ generator to allow for empty lists for type 'as'. This drops the
-+ != NULL check for NULL terminated arrays and moves the iteration
-+ loop inside an 'if' statement.
-+
-+2012-12-11 Dmitrijs Ledkovs <dmitrijs.ledkovs@canonical.com>
-+
-+ * nih/file.c (nih_dir_walk_scan): Fallback to lstat, if the
-+ non-portable dirent.d_type is not available (LP: #672643) (Closes:
-+ #695604).
-+
-+2012-12-10 Petr Lautrbach <plautrba@redhat.com>
-+
-+ * nih/tests/test_file.c: don't use dirent.d_type (not portable)
-+
-+2012-10-25 James Hunt <james.hunt@ubuntu.com>
-+
-+ * nih/logging.c: Use our own __nih_abort_msg rather than the
-+ (e)glibc private symbol __abort_msg to avoid upgrade issues (LP: #997359).
-+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
-+
-+2011-08-31 James Hunt <james.hunt@ubuntu.com>
-+
-+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
-+ (test_unix_fd_to_str): Sanity check value before invoking strchr in
-+ case it returns address of null (which would give a misleading test
-+ pass).
-+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
-+ (test_unix_fd_to_str, test_unix_fd_to_str_sync): Sanity check value
-+ before invoking strchr in case it returns address of null (which would
-+ give a misleading test pass).
-+ * nih/config.c (): nih_config_block_end: Add check to ensure strchr()
-+ doesn't return address of null since this would result in a misleading
-+ return value of TRUE.
-+
-+ * nih/string.c (nih_str_split): Fixes to avoid over-running
-+ input string and also returning an empty string array entry
-+ when repeat is true (LP: #834813).
-+ * nih/tests/test_string.c (test_str_split): Added a lot of new
-+ tests for nih_str_split().
-+
-+2011-08-26 James Hunt <james.hunt@ubuntu.com>
-+
-+ * nih/io.c (nih_io_select_fds): Ensure number of fds being managed
-+ is within limits.
-+
-+ * nih/config.c, nih/error.h, nih/io.c, nih/test_files.h: Correct
-+ typos in comments.
-+
-+2011-06-20 James Hunt <james.hunt@ubuntu.com>
-+
-+ * nih/watch.c (nih_watch_handle): Handle non-directory watches;
-+ previously a file watch resulted in an invalid file path ending in
-+ a single slash (LP:#777097).
-+ * nih/tests/test_watch.c: Added explicit test for watch on a file.
-+
- 2010-12-23 Scott James Remnant <scott@netsplit.com>
-
- * NEWS: Release 1.0.3
---- libnih-1.0.3.orig/nih/watch.c
-+++ libnih-1.0.3/nih/watch.c
-@@ -2,8 +2,8 @@
- *
- * watch.c - watching of files and directories with inotify
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -71,6 +71,9 @@
- uint32_t events, uint32_t cookie,
- const char *name,
- int *caught_free);
-+static int nih_watch_walk_filter (void *data, const char *path,
-+ int is_dir)
-+ __attribute__ ((warn_unused_result));
-
-
- /**
-@@ -91,7 +94,7 @@
- * sub-directories will be automatically watched.
- *
- * Additionally, the set of files and directories within @path can be
-- * limited by passing a @filter function which will recieve the paths and
-+ * limited by passing a @filter function which will receive the paths and
- * may return TRUE to indicate that the path received should not be watched.
- *
- * When a file is created within @path, or moved from outside this location
-@@ -104,7 +107,7 @@
- * files that exist under @path when the watch is first added. This only
- * occurs if the watch can be added.
- *
-- * This is a very high level wrapped around the inotify API; lower levels
-+ * This is a very high level wrapper around the inotify API; lower levels
- * can be obtained using the inotify API itself and some of the helper
- * functions used by this one.
- *
-@@ -185,6 +188,35 @@
- }
-
-
-+ /**
-+ * nih_watch_walk_filter:
-+ * @data: NihWatch,
-+ * @path: path to file,
-+ * @is_dir: TRUE if @path is a directory.
-+ *
-+ * Callback function for nih_dir_walk(), used by nih_watch_add() to wrap
-+ * the user-specified NihFileFilter (watch->filter) with a filter that can
-+ * take watch itself as an argument.
-+ *
-+ * Returns: TRUE if the path should be ignored, FALSE otherwise.
-+ **/
-+static int
-+nih_watch_walk_filter (void *data, const char *path, int is_dir)
-+{
-+ NihWatch *watch;
-+
-+ watch = (NihWatch *)data;
-+
-+ nih_assert (watch);
-+
-+ /* No filter, so accept all files */
-+ if (! watch->filter)
-+ return FALSE;
-+
-+ return watch->filter (watch->data, path, is_dir);
-+}
-+
-+
- /**
- * nih_watch_handle_by_wd:
- * @watch: watch to search,
-@@ -295,7 +327,7 @@
- * one; errors within the walk are warned automatically, so if this
- * fails, it means we literally couldn't watch the top-level.
- */
-- if (subdirs && (nih_dir_walk (path, watch->filter,
-+ if (subdirs && (nih_dir_walk (path, nih_watch_walk_filter,
- (NihFileVisitor)nih_watch_add_visitor,
- NULL, watch) < 0)) {
- NihError *err;
-@@ -494,12 +526,21 @@
- return;
- }
-
-+ /* Every other event must come with a name */
-+ if (name && *name) {
-
-- /* Every other event must come with a name. */
-- if ((! name) || strchr (name, '/'))
-- return;
-+ /* If name refers to a directory, there should be no associated
-+ * path - just the name of the path element.
-+ */
-+ if (strchr (name, '/'))
-+ return;
-
-- path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
-+ /* Event occured for file within a watched directory */
-+ path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
-+ } else {
-+ /* File event occured */
-+ path = NIH_MUST (nih_strdup (NULL, handle->path));
-+ }
-
- /* Check the filter */
- if (watch->filter && watch->filter (watch->data, path,
---- libnih-1.0.3.orig/nih/hash.h
-+++ libnih-1.0.3/nih/hash.h
-@@ -141,7 +141,7 @@
- * @hash: hash table to iterate,
- * @iter: name of iterator variable.
- *
-- * Expans to nested for statements that iterate over each entry in each
-+ * Expands to nested for statements that iterate over each entry in each
- * bin of @hash, except for the bin head pointer, setting @iter to each
- * entry for the block within the loop. A variable named _@iter_i is used
- * to iterate the hash bins.
-@@ -203,7 +203,7 @@
- NihKeyFunction key_function,
- NihHashFunction hash_function,
- NihCmpFunction cmp_function)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihList * nih_hash_add (NihHash *hash, NihList *entry);
- NihList * nih_hash_add_unique (NihHash *hash, NihList *entry);
---- libnih-1.0.3.orig/nih/main.h
-+++ libnih-1.0.3/nih/main.h
-@@ -138,7 +138,7 @@
-
- NihMainLoopFunc *nih_main_loop_add_func (const void *parent,
- NihMainLoopCb callback, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void nih_main_term_signal (void *data, NihSignal *signal);
-
---- libnih-1.0.3.orig/nih/command.h
-+++ libnih-1.0.3/nih/command.h
-@@ -123,7 +123,7 @@
-
- NihCommand *nih_command_join (const void *parent,
- const NihCommand *a, const NihCommand *b)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih/config.h
-+++ libnih-1.0.3/nih/config.h
-@@ -140,10 +140,10 @@
- char * nih_config_next_token (const void *parent, const char *file,
- size_t len, size_t *pos, size_t *lineno,
- const char *delim, int dequote)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * nih_config_next_arg (const void *parent, const char *file,
- size_t len, size_t *pos, size_t *lineno)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- void nih_config_next_line (const char *file, size_t len,
- size_t *pos, size_t *lineno);
-
-@@ -155,15 +155,15 @@
-
- char ** nih_config_parse_args (const void *parent, const char *file,
- size_t len, size_t *pos, size_t *lineno)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * nih_config_parse_command (const void *parent, const char *file,
- size_t len, size_t *pos, size_t *lineno)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * nih_config_parse_block (const void *parent, const char *file,
- size_t len, size_t *pos, size_t *lineno,
- const char *type)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- int nih_config_skip_block (const char *file, size_t len,
- size_t *lineno, size_t *pos,
- const char *type, size_t *endpos)
---- libnih-1.0.3.orig/nih/io.c
-+++ libnih-1.0.3/nih/io.c
-@@ -2,8 +2,8 @@
- *
- * io.c - file and socket input/output handling
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -165,6 +165,7 @@
- nih_assert (readfds != NULL);
- nih_assert (writefds != NULL);
- nih_assert (exceptfds != NULL);
-+ nih_assert (*nfds <= FD_SETSIZE);
-
- nih_io_init ();
-
-@@ -186,6 +187,9 @@
- *nfds = nih_max (*nfds, watch->fd + 1);
- }
- }
-+
-+ /* Re-check in case we exceeded the limit in the loop */
-+ nih_assert (*nfds <= FD_SETSIZE);
- }
-
- /**
-@@ -901,7 +905,7 @@
- * read and placed into the receive buffer or queue, and the reader function
- * is called if set.
- *
-- * Any data or messaages in the send buffer or queue are written out if the
-+ * Any data or messages in the send buffer or queue are written out if the
- * @events includes NIH_IO_WRITE.
- *
- * Errors are handled when data is read, and result in the error handled
-@@ -1211,7 +1215,7 @@
- * This function is called when the local end of a file descriptor being
- * managed by NihIo should be closed. Usually this is because the remote
- * end has been closed (without error) but it can also be because no
-- * error handler was given
-+ * error handler was given.
- *
- * Normally this just calls the close handler, or if not available, it
- * closes the file descriptor and frees the structure (which may be
-@@ -1291,7 +1295,7 @@
- * @io: structure to be destroyed.
- *
- * Closes the file descriptor associated with an NihIo structure so that
-- * the structure can be freed. IF an error is caught by closing the
-+ * the structure can be freed. If an error is caught by closing the
- * descriptor, the error handler is called instead of the error being raised;
- * this allows you to group your error handling in one place rather than
- * special-case close.
---- libnih-1.0.3.orig/nih/watch.h
-+++ libnih-1.0.3/nih/watch.h
-@@ -156,7 +156,7 @@
- NihCreateHandler create_handler,
- NihModifyHandler modify_handler,
- NihDeleteHandler delete_handler, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_watch_add (NihWatch *watch, const char *path, int subdirs)
- __attribute__ ((warn_unused_result));
---- libnih-1.0.3.orig/nih/tree.h
-+++ libnih-1.0.3/nih/tree.h
-@@ -344,9 +344,9 @@
-
- void nih_tree_init (NihTree *tree);
- NihTree * nih_tree_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- NihTreeEntry *nih_tree_entry_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihTree * nih_tree_add (NihTree *tree, NihTree *node,
- NihTreeWhere where);
---- libnih-1.0.3.orig/nih/file.c
-+++ libnih-1.0.3/nih/file.c
-@@ -65,7 +65,7 @@
- /* Prototypes for static functions */
- static char **nih_dir_walk_scan (const char *path, NihFileFilter filter,
- void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static int nih_dir_walk_visit (const char *dirname, NihList *dirs,
- const char *path, NihFileFilter filter,
- NihFileVisitor visitor,
-@@ -619,6 +619,8 @@
- struct dirent *ent;
- char **paths;
- size_t npaths;
-+ int isdir;
-+ struct stat statbuf;
-
- nih_assert (path != NULL);
-
-@@ -640,7 +642,15 @@
- subpath = NIH_MUST (nih_sprintf (NULL, "%s/%s",
- path, ent->d_name));
-
-- if (filter && filter (data, subpath, ent->d_type == DT_DIR))
-+ if (ent->d_type == DT_UNKNOWN) {
-+ if ( lstat (subpath, &statbuf))
-+ isdir = 0;
-+ else
-+ isdir = S_ISDIR(statbuf.st_mode);
-+ } else
-+ isdir = ent->d_type == DT_DIR;
-+
-+ if (filter && filter (data, subpath, isdir))
- continue;
-
- NIH_MUST (nih_str_array_addp (&paths, NULL, &npaths, subpath));
---- libnih-1.0.3.orig/nih/alloc.c
-+++ libnih-1.0.3/nih/alloc.c
-@@ -119,8 +119,7 @@
- static inline int nih_alloc_context_free (NihAllocCtx *ctx);
-
- static inline NihAllocRef *nih_alloc_ref_new (NihAllocCtx *parent,
-- NihAllocCtx *child)
-- __attribute__ ((malloc));
-+ NihAllocCtx *child);
- static inline void nih_alloc_ref_free (NihAllocRef *ref);
- static inline NihAllocRef *nih_alloc_ref_lookup (NihAllocCtx *parent,
- NihAllocCtx *child);
---- libnih-1.0.3.orig/nih/timer.h
-+++ libnih-1.0.3/nih/timer.h
-@@ -59,7 +59,7 @@
- * @months: months (1-12),
- * @wdays: days of week (0-7).
- *
-- * Indidcates when scheduled timers should be run, each member is a bit
-+ * Indicates when scheduled timers should be run, each member is a bit
- * field where the bit is 1 if the timer should be run for that value and
- * 0 if not.
- **/
-@@ -117,14 +117,14 @@
-
- NihTimer *nih_timer_add_timeout (const void *parent, time_t timeout,
- NihTimerCb callback, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- NihTimer *nih_timer_add_periodic (const void *parent, time_t period,
- NihTimerCb callback, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- NihTimer *nih_timer_add_scheduled (const void *parent,
- NihTimerSchedule *schedule,
- NihTimerCb callback, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihTimer *nih_timer_next_due (void);
- void nih_timer_poll (void);
---- libnih-1.0.3.orig/nih/config.c
-+++ libnih-1.0.3/nih/config.c
-@@ -2,8 +2,8 @@
- *
- * config.c - configuration file parsing
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -657,7 +657,7 @@
- * of the returned string are freed, the returned string will also be
- * freed.
- *
-- * Returns: the command found or NULL on raised error.
-+ * Returns: the newly allocated command found or NULL on raised error.
- **/
- char *
- nih_config_parse_command (const void *parent,
-@@ -714,7 +714,7 @@
- * @lineno: line number,
- * @type: block identifier.
- *
-- * Extracts a block of text from @line, stopping when the pharse "end @type"
-+ * Extracts a block of text from @line, stopping when the phrase "end @type"
- * is encountered without any quotes or blackslash escaping within it.
- *
- * @file may be a memory mapped file, in which case @pos should be given
-@@ -950,7 +950,7 @@
- return FALSE;
-
- /* Must be whitespace after */
-- if (! strchr (NIH_CONFIG_WS, file[p + 3]))
-+ if (file[p + 3] && ! strchr (NIH_CONFIG_WS, file[p + 3]))
- return FALSE;
-
- /* Find the second word */
---- libnih-1.0.3.orig/nih/option.h
-+++ libnih-1.0.3/nih/option.h
-@@ -124,11 +124,11 @@
- char ** nih_option_parser (const void *parent,
- int argc, char *argv[],
- NihOption *options, int break_nonopt)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihOption *nih_option_join (const void *parent,
- const NihOption *a, const NihOption *b)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_option_count (NihOption *option, const char *arg);
- int nih_option_int (NihOption *option, const char *arg);
---- libnih-1.0.3.orig/nih/signal.h
-+++ libnih-1.0.3/nih/signal.h
-@@ -76,7 +76,7 @@
-
- NihSignal * nih_signal_add_handler (const void *parent, int signum,
- NihSignalHandler handler, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void nih_signal_handler (int signum);
- void nih_signal_poll (void);
---- libnih-1.0.3.orig/nih/list.h
-+++ libnih-1.0.3/nih/list.h
-@@ -37,7 +37,7 @@
- * after a known entry, and remove an entry from the list.
- *
- * List entries may be created in one of two ways. The most common is to
-- * embed the NihList structure as the frist member of your own structure,
-+ * embed the NihList structure as the first member of your own structure,
- * and initialise it with nih_list_init() after allocating the structure.
- * Alternatively you may create NihListEntry structures with
- * nih_list_entry_new() and point at your own data from them.
-@@ -196,10 +196,10 @@
-
- void nih_list_init (NihList *entry);
- NihList * nih_list_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihListEntry *nih_list_entry_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
-
- NihList * nih_list_add (NihList *list, NihList *entry);
---- libnih-1.0.3.orig/nih/logging.c
-+++ libnih-1.0.3/nih/logging.c
-@@ -39,11 +39,11 @@
-
-
- /**
-- * __abort_msg:
-+ * __nih_abort_msg:
- *
-- * A glibc variable that keeps the assertion message in the core dump.
-+ * A variable that keeps the assertion message in the core dump.
- **/
--extern char *__abort_msg __attribute__ ((weak));
-+char *__nih_abort_msg = NULL;
-
- /**
- * logger:
-@@ -114,19 +114,16 @@
- * nih_log_abort_message:
- * @message: message to be logged.
- *
-- * Save @message in the glibc __abort_msg variable so it can be retrieved
-+ * Save @message in the __nih_abort_msg variable so it can be retrieved
- * by debuggers if we should crash at this point.
- **/
- static void
- nih_log_abort_message (const char *message)
- {
-- if (! &__abort_msg)
-- return;
-+ if (__nih_abort_msg)
-+ nih_discard (__nih_abort_msg);
-
-- if (__abort_msg)
-- nih_discard (__abort_msg);
--
-- __abort_msg = NIH_MUST (nih_strdup (NULL, message));
-+ __nih_abort_msg = NIH_MUST (nih_strdup (NULL, message));
- }
-
- /**
---- libnih-1.0.3.orig/nih/test_files.h
-+++ libnih-1.0.3/nih/test_files.h
-@@ -1,7 +1,7 @@
- /* libnih
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -39,7 +39,7 @@
- * TEST_FILENAME:
- * @_var: variable to store filename in.
- *
-- * Generate a filename that may be used for testing, it's unlinked it if
-+ * Generate a filename that may be used for testing, it's unlinked if it
- * exists and it's up to you to unlink it when done. @_var should be at
- * least PATH_MAX long.
- **/
---- libnih-1.0.3.orig/nih/test_process.h
-+++ libnih-1.0.3/nih/test_process.h
-@@ -36,7 +36,7 @@
- * Spawn a child in which a test can be performed without affecting the
- * main flow of the process. The pid of the child is stored in @_pid.
- *
-- * This macro ensures that the child has begun exectution before the
-+ * This macro ensures that the child has begun execution before the
- * parent is allowed to continue through the usual use of a pipe.
- *
- * A block of code should follow this macro, which is the code that will
---- libnih-1.0.3.orig/nih/child.h
-+++ libnih-1.0.3/nih/child.h
-@@ -98,7 +98,7 @@
- NihChildWatch *nih_child_add_watch (const void *parent, pid_t pid,
- NihChildEvents events,
- NihChildHandler handler, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void nih_child_poll (void);
-
---- libnih-1.0.3.orig/nih/alloc.h
-+++ libnih-1.0.3/nih/alloc.h
-@@ -299,7 +299,7 @@
- * It is permissible to take references to foo within its scope, or by
- * functions called, in which case it will not be freed. Also it is
- * generally nonsensical to allocate with a parent, since this too will
-- * prevent it from beign freed.
-+ * prevent it from being freed.
- **/
- #define nih_local __attribute__ ((cleanup(_nih_discard_local)))
-
-@@ -307,11 +307,11 @@
- NIH_BEGIN_EXTERN
-
- void * nih_alloc (const void *parent, size_t size)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void * nih_realloc (void *ptr, const void *parent,
- size_t size)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_free (void *ptr);
- int nih_discard (void *ptr);
---- libnih-1.0.3.orig/nih/io.h
-+++ libnih-1.0.3/nih/io.h
-@@ -269,7 +269,7 @@
- NihIoWatch * nih_io_add_watch (const void *parent, int fd,
- NihIoEvents events,
- NihIoWatcher watcher, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void nih_io_select_fds (int *nfds, fd_set *readfds,
- fd_set *writefds, fd_set *exceptfds);
-@@ -278,12 +278,12 @@
-
-
- NihIoBuffer * nih_io_buffer_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_io_buffer_resize (NihIoBuffer *buffer, size_t grow);
- char * nih_io_buffer_pop (const void *parent,
- NihIoBuffer *buffer, size_t *len)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- void nih_io_buffer_shrink (NihIoBuffer *buffer, size_t len);
- int nih_io_buffer_push (NihIoBuffer *buffer,
- const char *str, size_t len)
-@@ -291,7 +291,7 @@
-
-
- NihIoMessage *nih_io_message_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_io_message_add_control (NihIoMessage *message, int level,
- int type, socklen_t len,
-@@ -300,7 +300,7 @@
-
- NihIoMessage *nih_io_message_recv (const void *parent, int fd,
- size_t *len)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- ssize_t nih_io_message_send (NihIoMessage *message, int fd)
- __attribute__ ((warn_unused_result));
-
-@@ -310,7 +310,7 @@
- NihIoCloseHandler close_handler,
- NihIoErrorHandler error_handler,
- void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- void nih_io_shutdown (NihIo *io);
- int nih_io_destroy (NihIo *io);
-
-@@ -319,14 +319,14 @@
-
- char * nih_io_read (const void *parent, NihIo *io,
- size_t *len)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- int nih_io_write (NihIo *io, const char *str,
- size_t len)
- __attribute__ ((warn_unused_result));
-
- char * nih_io_get (const void *parent, NihIo *io,
- const char *delim)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int nih_io_printf (NihIo *io, const char *format, ...)
- __attribute__ ((warn_unused_result, format (printf, 2, 3)));
---- libnih-1.0.3.orig/nih/test_output.h
-+++ libnih-1.0.3/nih/test_output.h
-@@ -61,10 +61,10 @@
-
- /**
- * TEST_FEATURE:
-- * @_feat: name of function feature being tested.
-+ * @_feat: name of function or group feature being tested.
- *
-- * Output a message indicating that a sub-test of a function is being
-- * performed, specifically the feature named _feat.
-+ * Output a message indicating that a sub-test of a function or
-+ * group is being performed, specifically the feature named _feat.
- **/
- #define TEST_FEATURE(_feat) \
- printf ("...%s\n", _feat);
---- libnih-1.0.3.orig/nih/error.h
-+++ libnih-1.0.3/nih/error.h
-@@ -1,7 +1,7 @@
- /* libnih
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -111,7 +111,7 @@
- * @message: human-readable message.
- *
- * Raises an error with the given details in the current error context,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- *
- * @message should be a static string, as it will not be freed when the
-@@ -126,7 +126,7 @@
- * @format: format string for human-readable message.
- *
- * Raises an error with the given details in the current error context,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- *
- * The human-readable message for the error is parsed according to @format,
-@@ -140,7 +140,7 @@
- * nih_error_raise_system:
- *
- * Raises an error with details taken from the current value of errno,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- **/
- #define nih_error_raise_system() \
-@@ -162,7 +162,7 @@
- * @error: existing object to raise.
- *
- * Raises the existing error object in the current error context,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- *
- * This is normally used to raise a taken error that has not been handled,
-@@ -182,7 +182,7 @@
- * @message: human-readable message.
- *
- * Raises an error with the given details in the current error context,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- *
- * Will return from the current function with @retval, which may be left
-@@ -199,7 +199,7 @@
- * @retval: return value for function.
- *
- * Raises an error with details taken from the current value of errno,
-- * if an unhandled error already exists then an error message is emmitted
-+ * if an unhandled error already exists then an error message is emitted
- * through the logging system; you should try to avoid this.
- *
- * Will return from the current function with @retval, which may be left
---- libnih-1.0.3.orig/nih/string.h
-+++ libnih-1.0.3/nih/string.h
-@@ -35,60 +35,60 @@
- NIH_BEGIN_EXTERN
-
- char * nih_sprintf (const void *parent, const char *format, ...)
-- __attribute__ ((format (printf, 2, 3), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 2, 3), warn_unused_result));
-
- char * nih_vsprintf (const void *parent, const char *format,
- va_list args)
-- __attribute__ ((format (printf, 2, 0), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 2, 0), warn_unused_result));
-
- char * nih_strdup (const void *parent, const char *str)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * nih_strndup (const void *parent, const char *str, size_t len)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * nih_strcat (char **str, const void *parent, const char *src)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * nih_strncat (char **str, const void *parent, const char *src,
- size_t len)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * nih_strcat_sprintf (char **str, const void *parent,
- const char *format, ...)
-- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
- char * nih_strcat_vsprintf (char **str, const void *parent,
- const char *format, va_list args)
-- __attribute__ ((format (printf, 3, 0), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 3, 0), warn_unused_result));
-
- char **nih_str_split (const void *parent, const char *str,
- const char *delim, int repeat)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char **nih_str_array_new (const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char **nih_str_array_add (char ***array, const void *parent, size_t *len,
- const char *str)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char **nih_str_array_addn (char ***array, const void *parent, size_t *len,
- const char *str, size_t strlen)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char **nih_str_array_addp (char ***array, const void *parent, size_t *len,
- void *ptr)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char **nih_str_array_copy (const void *parent, size_t *len,
- char * const *array)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char **nih_str_array_append (char ***array, const void *parent, size_t *len,
- char * const *args)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * nih_str_wrap (const void *parent, const char *str, size_t len,
- size_t first_indent, size_t indent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- size_t nih_str_screen_width (void);
- char * nih_str_screen_wrap (const void *parent, const char *str,
- size_t first_indent, size_t indent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih/string.c
-+++ libnih-1.0.3/nih/string.c
-@@ -405,7 +405,7 @@
- const char *ptr;
-
- /* Skip initial delimiters */
-- while (repeat && strchr (delim, *str))
-+ while (repeat && *str && strchr (delim, *str))
- str++;
-
- /* Find the end of the token */
-@@ -413,6 +413,13 @@
- while (*str && (! strchr (delim, *str)))
- str++;
-
-+ /* Don't create an empty string array element in repeat
-+ * mode if there is no token (as a result of a
-+ * duplicated delimiter character).
-+ */
-+ if (repeat && (str == ptr))
-+ continue;
-+
- if (! nih_str_array_addn (&array, parent, &len,
- ptr, str - ptr)) {
- nih_free (array);
---- libnih-1.0.3.orig/nih/file.h
-+++ libnih-1.0.3/nih/file.h
-@@ -82,7 +82,7 @@
-
- char *nih_file_read (const void *parent, const char *path,
- size_t *length)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void *nih_file_map (const char *path, int flags, size_t *length)
- __attribute__ ((warn_unused_result));
---- libnih-1.0.3.orig/nih/tests/test_option.c
-+++ libnih-1.0.3/nih/tests/test_option.c
-@@ -1574,7 +1574,7 @@
- output = tmpfile ();
- TEST_CHILD (pid) {
- TEST_DIVERT_STDOUT (output) {
-- char **args;
-+ char **args __attribute__((unused));
-
- args = nih_option_parser (NULL, argc, argv,
- options, FALSE);
-@@ -1652,7 +1652,7 @@
- unsetenv ("COLUMNS");
-
- TEST_DIVERT_STDOUT (output) {
-- char **args;
-+ char **args __attribute__((unused));
-
- args = nih_option_parser (NULL, argc, argv,
- options, FALSE);
---- libnih-1.0.3.orig/nih/tests/test_logging.c
-+++ libnih-1.0.3/nih/tests/test_logging.c
-@@ -31,7 +31,7 @@
- #include <nih/main.h>
-
-
--extern char *__abort_msg __attribute__ ((weak));
-+extern char *__nih_abort_msg;
-
- static NihLogLevel last_priority = NIH_LOG_UNKNOWN;
- static char * last_message = NULL;
-@@ -156,68 +156,63 @@
- }
-
-
-- /* Check that a fatal message is also stored in the glibc __abort_msg
-+ /* Check that a fatal message is also stored in the __nih_abort_msg
- * variable.
- */
-- if (&__abort_msg) {
-- TEST_FEATURE ("with fatal message");
-- TEST_ALLOC_FAIL {
-- __abort_msg = NULL;
-- last_priority = NIH_LOG_UNKNOWN;
-- last_message = NULL;
--
-- ret = nih_log_message (NIH_LOG_FATAL,
-- "message with %s %d formatting",
-- "some", 20);
--
-- TEST_EQ (ret, 0);
-- TEST_EQ (last_priority, NIH_LOG_FATAL);
-- TEST_EQ_STR (last_message, "message with some 20 formatting");
--
-- TEST_NE_P (__abort_msg, NULL);
-- TEST_ALLOC_PARENT (__abort_msg, NULL);
-- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
-+ TEST_FEATURE ("with fatal message");
-+ TEST_ALLOC_FAIL {
-+ __nih_abort_msg = NULL;
-+ last_priority = NIH_LOG_UNKNOWN;
-+ last_message = NULL;
-
-- free (last_message);
-- }
-+ ret = nih_log_message (NIH_LOG_FATAL,
-+ "message with %s %d formatting",
-+ "some", 20);
-
-+ TEST_EQ (ret, 0);
-+ TEST_EQ (last_priority, NIH_LOG_FATAL);
-+ TEST_EQ_STR (last_message, "message with some 20 formatting");
-
-- /* Check that a fatal message can safely overwrite one already stored
-- * in the glibc __abort_msg variable.
-- */
-- TEST_FEATURE ("with second fatal message");
-- TEST_ALLOC_FAIL {
-- TEST_ALLOC_SAFE {
-- msg = nih_strdup (NULL, "test");
-- }
--
-- __abort_msg = msg;
-- TEST_FREE_TAG (msg);
--
-- last_priority = NIH_LOG_UNKNOWN;
-- last_message = NULL;
--
-- ret = nih_log_message (NIH_LOG_FATAL,
-- "message with %s %d formatting",
-- "some", 20);
--
-- TEST_EQ (ret, 0);
-- TEST_EQ (last_priority, NIH_LOG_FATAL);
-- TEST_EQ_STR (last_message, "message with some 20 formatting");
--
-- TEST_FREE (msg);
--
-- TEST_NE_P (__abort_msg, NULL);
-- TEST_ALLOC_PARENT (__abort_msg, NULL);
-- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
-+ TEST_NE_P (__nih_abort_msg, NULL);
-+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
-+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
-
-- free (last_message);
-- }
-- } else {
-- printf ("SKIP: __abort_msg not available\n");
-+ free (last_message);
- }
-
-
-+ /* Check that a fatal message can safely overwrite one already stored
-+ * in the __nih_abort_msg variable.
-+ */
-+ TEST_FEATURE ("with second fatal message");
-+ TEST_ALLOC_FAIL {
-+ TEST_ALLOC_SAFE {
-+ msg = nih_strdup (NULL, "test");
-+ }
-+
-+ __nih_abort_msg = msg;
-+ TEST_FREE_TAG (msg);
-+
-+ last_priority = NIH_LOG_UNKNOWN;
-+ last_message = NULL;
-+
-+ ret = nih_log_message (NIH_LOG_FATAL,
-+ "message with %s %d formatting",
-+ "some", 20);
-+
-+ TEST_EQ (ret, 0);
-+ TEST_EQ (last_priority, NIH_LOG_FATAL);
-+ TEST_EQ_STR (last_message, "message with some 20 formatting");
-+
-+ TEST_FREE (msg);
-+
-+ TEST_NE_P (__nih_abort_msg, NULL);
-+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
-+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
-+
-+ free (last_message);
-+ }
-+
- /* Check that the nih_debug macro wraps the call properly and
- * includes the function in which the message occurred.
- */
---- libnih-1.0.3.orig/nih/tests/test_hash.c
-+++ libnih-1.0.3/nih/tests/test_hash.c
-@@ -470,7 +470,8 @@
- test_lookup (void)
- {
- NihHash *hash;
-- NihList *entry1, *entry2, *entry3, *ptr;
-+ NihList *entry1, *entry2, *ptr;
-+ NihList *entry3 __attribute__((unused));
-
- TEST_FUNCTION ("nih_hash_lookup");
- hash = nih_hash_string_new (NULL, 0);
---- libnih-1.0.3.orig/nih/tests/test_main.c
-+++ libnih-1.0.3/nih/tests/test_main.c
-@@ -457,7 +457,7 @@
- test_main_loop (void)
- {
- NihMainLoopFunc *func;
-- NihTimer *timer;
-+ NihTimer *timer __attribute__((unused));
- int ret;
-
- /* Check that we can run through the main loop, and that the
---- libnih-1.0.3.orig/nih/tests/test_watch.c
-+++ libnih-1.0.3/nih/tests/test_watch.c
-@@ -2,8 +2,8 @@
- *
- * test_watch.c - test suite for nih/watch.c
- *
-- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
-- * Copyright © 2009 Canonical Ltd.
-+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
-+ * Copyright © 2011 Canonical Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2, as
-@@ -39,6 +39,8 @@
- #include <nih/error.h>
- #include <nih/logging.h>
-
-+/* Read "The Hitchhikers Guide to the Galaxy" */
-+#define FILTER_VALUE 42
-
- static int
- my_filter (void *data,
-@@ -54,6 +56,26 @@
- return FALSE;
- }
-
-+/* Set by my_filter2 () so it knows if it has already been called */
-+static int my_filter2_called = 0;
-+
-+static int
-+my_filter2 (int *value,
-+ const char *path,
-+ int is_dir)
-+{
-+ /* we only want to toggle the value once */
-+ if (my_filter2_called)
-+ return TRUE;
-+
-+ my_filter2_called = 1;
-+
-+ nih_assert (value && *value == FILTER_VALUE);
-+ *value = 0;
-+
-+ return FALSE;
-+}
-+
- static int create_called = 0;
- static int modify_called = 0;
- static int delete_called = 0;
-@@ -553,6 +575,44 @@
- nih_free (watch);
- }
-
-+ /* Ensure the file filter gets passed the correct data pointer.
-+ */
-+ TEST_FEATURE ("with filter and data");
-+
-+ /* Ensure we have a new directory */
-+ TEST_FILENAME (dirname);
-+ mkdir (dirname, 0755);
-+
-+ /* Create a single file */
-+ strcpy (filename, dirname);
-+ strcat (filename, "/foo");
-+
-+ fd = fopen (filename, "w");
-+ fprintf (fd, "test\n");
-+ fclose (fd);
-+
-+ TEST_ALLOC_FAIL {
-+ int watch_data = FILTER_VALUE;
-+
-+ /* Reset required to appease TEST_ALLOC_FAIL */
-+ my_filter2_called = 0;
-+
-+ watch = nih_watch_new (NULL, dirname,
-+ TRUE, TRUE,
-+ (NihFileFilter)my_filter2,
-+ NULL, NULL, NULL,
-+ &watch_data);
-+
-+ TEST_NE_P (watch, NULL);
-+
-+ /* Ensure the filter was called and changed the value */
-+
-+ TEST_NE (my_filter2_called, 0);
-+ TEST_EQ (watch_data, 0);
-+
-+ nih_free (watch);
-+ }
-+
- strcpy (filename, dirname);
- strcat (filename, "/bar");
- chmod (filename, 0755);
-@@ -946,13 +1006,82 @@
- nih_error_init ();
-
- TEST_FILENAME (dirname);
-- mkdir (dirname, 0755);
-+ TEST_EQ (mkdir (dirname, 0755), 0);
-
-- watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
-- my_create_handler, my_modify_handler,
-+ TEST_FEATURE ("with watched file");
-+ strcpy (filename, dirname);
-+ strcat (filename, "/foo");
-+
-+ /* Create file first since we don't set a create handler on the
-+ * watch.
-+ */
-+ fd = fopen (filename, "w");
-+ fprintf (fd, "bar\n");
-+ fclose (fd);
-+
-+ create_called = 0;
-+ modify_called = 0;
-+ delete_called = 0;
-+ logger_called = 0;
-+ last_path = NULL;
-+ last_watch = NULL;
-+ last_data = NULL;
-+
-+ watch = nih_watch_new (NULL, filename, FALSE, FALSE, NULL,
-+ NULL, my_modify_handler,
- my_delete_handler, &watch);
-+ TEST_NE_P (watch, NULL);
-+
-+ /* Now, modify the existing file to trigger the modify handler. */
-+ fd = fopen (filename, "a+");
-+ fprintf (fd, "baz\n");
-+ fclose (fd);
-+
-+ nfds = 0;
-+ FD_ZERO (&readfds);
-+ FD_ZERO (&writefds);
-+ FD_ZERO (&exceptfds);
-+
-+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
-+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
-+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
-+
-+ TEST_EQ_STR (watch->path, filename);
-+
-+ /* Ensure no regression to old behaviour (LP:#777097) */
-+ TEST_NE (last_path[ strlen(last_path) - 1 ], '/');
-+
-+ TEST_EQ_STR (last_path, filename);
-+ TEST_EQ (modify_called, 1);
-+
-+ unlink (filename);
-+
-+ nfds = 0;
-+ FD_ZERO (&readfds);
-+ FD_ZERO (&writefds);
-+ FD_ZERO (&exceptfds);
-+
-+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
-+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
-+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
-
-+ TEST_EQ (delete_called, 1);
-
-+ rmdir (filename);
-+ nih_free (last_path);
-+
-+ create_called = 0;
-+ modify_called = 0;
-+ delete_called = 0;
-+ logger_called = 0;
-+ last_path = NULL;
-+ last_watch = NULL;
-+ last_data = NULL;
-+
-+
-+ watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
-+ my_create_handler, my_modify_handler,
-+ my_delete_handler, &watch);
- /* Check that creating a file within the directory being watched
- * results in the create handler being called, and passed the full
- * path of the created file to it.
---- libnih-1.0.3.orig/nih/tests/test_string.c
-+++ libnih-1.0.3/nih/tests/test_string.c
-@@ -619,6 +619,215 @@
- nih_free (array);
- }
-
-+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
-+ "characters at string start");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "\t\tthis is a test", " \t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
-+ for (i = 0; i < 6; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "");
-+ TEST_EQ_STR (array[1], "");
-+ TEST_EQ_STR (array[2], "this");
-+ TEST_EQ_STR (array[3], "is");
-+ TEST_EQ_STR (array[4], "a");
-+ TEST_EQ_STR (array[5], "test");
-+ TEST_EQ_P (array[6], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple different delimiter "
-+ "characters at string start");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, " \tthis is a test", " \t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
-+ for (i = 0; i < 6; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "");
-+ TEST_EQ_STR (array[1], "");
-+ TEST_EQ_STR (array[2], "this");
-+ TEST_EQ_STR (array[3], "is");
-+ TEST_EQ_STR (array[4], "a");
-+ TEST_EQ_STR (array[5], "test");
-+ TEST_EQ_P (array[6], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
-+ "characters within string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "this is a\t\ttest", " \t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 8);
-+ for (i = 0; i < 7; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "this");
-+ TEST_EQ_STR (array[1], "is");
-+ TEST_EQ_STR (array[2], "");
-+ TEST_EQ_STR (array[3], "");
-+ TEST_EQ_STR (array[4], "a");
-+ TEST_EQ_STR (array[5], "");
-+ TEST_EQ_STR (array[6], "test");
-+ TEST_EQ_P (array[7], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple different delimiter "
-+ "characters within string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "this is \n\ta\ttest", " \t\n", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
-+ for (i = 0; i < 6; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "this");
-+ TEST_EQ_STR (array[1], "is");
-+ TEST_EQ_STR (array[2], "");
-+ TEST_EQ_STR (array[3], "");
-+ TEST_EQ_STR (array[4], "a");
-+ TEST_EQ_STR (array[5], "test");
-+ TEST_EQ_P (array[6], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
-+ "characters at string end");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "this is a test ", " \t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
-+ for (i = 0; i < 5; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "this");
-+ TEST_EQ_STR (array[1], "is");
-+ TEST_EQ_STR (array[2], "a");
-+ TEST_EQ_STR (array[3], "test");
-+ TEST_EQ_STR (array[4], "");
-+ TEST_EQ_P (array[5], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple different delimiter "
-+ "characters at string end");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "this is a test \t", " \t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
-+ for (i = 0; i < 5; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "this");
-+ TEST_EQ_STR (array[1], "is");
-+ TEST_EQ_STR (array[2], "a");
-+ TEST_EQ_STR (array[3], "test");
-+ TEST_EQ_STR (array[4], "");
-+ TEST_EQ_P (array[5], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
-+ "characters at beginning, middle and end of string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, " this is\n\n\na test\t\t\t", " \t\n", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 12);
-+ for (i = 0; i < 11; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "");
-+ TEST_EQ_STR (array[1], "");
-+ TEST_EQ_STR (array[2], "");
-+ TEST_EQ_STR (array[3], "this");
-+ TEST_EQ_STR (array[4], "is");
-+ TEST_EQ_STR (array[5], "");
-+ TEST_EQ_STR (array[6], "");
-+ TEST_EQ_STR (array[7], "a");
-+ TEST_EQ_STR (array[8], "test");
-+ TEST_EQ_STR (array[9], "");
-+ TEST_EQ_STR (array[10], "");
-+ TEST_EQ_P (array[11], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with no repeat and multiple different delimiter "
-+ "characters at beginning, middle and end of string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, ": \nthis is\t \n:a test:\n ", "\n :\t", FALSE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 13);
-+ for (i = 0; i < 12; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "");
-+ TEST_EQ_STR (array[1], "");
-+ TEST_EQ_STR (array[2], "");
-+ TEST_EQ_STR (array[3], "this");
-+ TEST_EQ_STR (array[4], "is");
-+ TEST_EQ_STR (array[5], "");
-+ TEST_EQ_STR (array[6], "");
-+ TEST_EQ_STR (array[7], "");
-+ TEST_EQ_STR (array[8], "a");
-+ TEST_EQ_STR (array[9], "test");
-+ TEST_EQ_STR (array[10], "");
-+ TEST_EQ_STR (array[11], "");
-+ TEST_EQ_P (array[12], NULL);
-+
-+ nih_free (array);
-+ }
-
- /* Check that we can split a string treating multiple consecutive
- * matching characters as a single separator to be skipped.
-@@ -645,6 +854,177 @@
- nih_free (array);
- }
-
-+ /* Check that we can split a string containing multiple
-+ * occurences of one of the delimiter characters at the
-+ * beginning of the string.
-+ */
-+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter characters at string start");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "\n\nhello", " \t\r\n", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
-+ for (i = 0; i < 1; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_P (array[1], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter characters at string start");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "\n\r hello", " \t\r\n", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
-+ for (i = 0; i < 1; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_P (array[1], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
-+ "characters within string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "hello\n\rworld", " \t\n\r", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
-+ for (i = 0; i < 2; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_STR (array[1], "world");
-+ TEST_EQ_P (array[2], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
-+ "characters within string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "hello\n\r\tworld", " \t\n\r", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
-+ for (i = 0; i < 2; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_STR (array[1], "world");
-+ TEST_EQ_P (array[2], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
-+ "characters at string end");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "hello\n\n\n\n\n\n\n", " \t\r\n", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
-+ for (i = 0; i < 1; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_P (array[1], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
-+ "characters at string end");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL, "hello \r\t\r\t\n ", " \t\r\n", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
-+ for (i = 0; i < 1; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_P (array[1], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
-+ "characters at beginning, middle and end of string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL,
-+ " hello\n\n\n, world\n\n\n",
-+ "\r\t\n ", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
-+ for (i = 0; i < 3; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_STR (array[1], ",");
-+ TEST_EQ_STR (array[2], "world");
-+ TEST_EQ_P (array[3], NULL);
-+
-+ nih_free (array);
-+ }
-+
-+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
-+ "characters at beginning, middle and end of string");
-+ TEST_ALLOC_FAIL {
-+ array = nih_str_split (NULL,
-+ "\n \r\thello\n\n\r , \n\t\rworld\t \r\n \n",
-+ " \t\n\r", TRUE);
-+
-+ if (test_alloc_failed) {
-+ TEST_EQ_P (array, NULL);
-+ continue;
-+ }
-+
-+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
-+ for (i = 0; i < 3; i++)
-+ TEST_ALLOC_PARENT (array[i], array);
-+
-+ TEST_EQ_STR (array[0], "hello");
-+ TEST_EQ_STR (array[1], ",");
-+ TEST_EQ_STR (array[2], "world");
-+ TEST_EQ_P (array[3], NULL);
-+
-+ nih_free (array);
-+ }
-
- /* Check that we can give an empty string, and end up with a
- * one-element array that only contains a NULL pointer.
---- libnih-1.0.3.orig/nih/tests/test_file.c
-+++ libnih-1.0.3/nih/tests/test_file.c
-@@ -724,6 +724,25 @@
- return FALSE;
- }
-
-+/* find only frodo files */
-+static int
-+my_filter_frodo_file (void *data,
-+ const char *path,
-+ int is_dir)
-+{
-+ char *slash;
-+
-+ if (is_dir)
-+ return FALSE;
-+
-+ slash = strrchr (path, '/');
-+ if (strcmp (slash, "/frodo"))
-+ return TRUE;
-+
-+ return FALSE;
-+}
-+
-+
- static int logger_called = 0;
-
- static int
-@@ -905,6 +924,48 @@
- TEST_EQ_STR (v->path, filename);
-
- nih_free (visited);
-+
-+ /* Try also inverse filter */
-+ TEST_ALLOC_SAFE {
-+ visitor_called = 0;
-+ visited = nih_list_new (NULL);
-+ }
-+
-+ ret = nih_dir_walk (dirname, my_filter_frodo_file,
-+ my_visitor, NULL, &ret);
-+
-+ TEST_EQ (ret, 0);
-+ TEST_EQ (visitor_called, 4);
-+
-+ v = (Visited *)visited->next;
-+ TEST_EQ (v->data, &ret);
-+ TEST_EQ_STR (v->dirname, dirname);
-+ strcpy (filename, dirname);
-+ strcat (filename, "/bar");
-+ TEST_EQ_STR (v->path, filename);
-+
-+ v = (Visited *)v->entry.next;
-+ TEST_EQ (v->data, &ret);
-+ TEST_EQ_STR (v->dirname, dirname);
-+ strcpy (filename, dirname);
-+ strcat (filename, "/bar/frodo");
-+ TEST_EQ_STR (v->path, filename);
-+
-+ v = (Visited *)v->entry.next;
-+ TEST_EQ (v->data, &ret);
-+ TEST_EQ_STR (v->dirname, dirname);
-+ strcpy (filename, dirname);
-+ strcat (filename, "/baz");
-+ TEST_EQ_STR (v->path, filename);
-+
-+ v = (Visited *)v->entry.next;
-+ TEST_EQ (v->data, &ret);
-+ TEST_EQ_STR (v->dirname, dirname);
-+ strcpy (filename, dirname);
-+ strcat (filename, "/frodo");
-+ TEST_EQ_STR (v->path, filename);
-+
-+ nih_free (visited);
- }
-
-
---- libnih-1.0.3.orig/debian/control
-+++ libnih-1.0.3/debian/control
-@@ -0,0 +1,81 @@
-+Source: libnih
-+Section: libs
-+Priority: required
-+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
-+XSBC-Original-Maintainer: Scott James Remnant <scott@netsplit.com>
-+Standards-Version: 3.9.4
-+Build-Depends: debhelper (>= 9), pkg-config (>= 0.22), libdbus-1-dev (>= 1.4), libexpat1-dev (>= 2.0.0), dbus (>= 1.4), libc6-dev (>= 2.15~) | libc6.1-dev (>= 2.15~),
-+ dh-autoreconf, autopoint, dpkg-dev (>= 1.16.1~)
-+# To cross build this package also needs: libdbus-1-dev:native (>= 1.4), libexpat1-dev:native (>= 2.0.0)
-+# But :native build-deps are not supported yet, so instead one can do
-+# $ apt-get build-dep libnih
-+# $ apt-get build-dep libnih -aarmhf
-+# instead to get all required build-deps
-+Vcs-Bzr: lp:ubuntu/libnih
-+XSC-Debian-Vcs-Git: git://git.debian.org/git/collab-maint/libnih.git
-+XSC-Debian-Vcs-Browser: http://git.debian.org/?p=collab-maint/libnih.git;a=summary
-+Homepage: https://launchpad.net/libnih
-+
-+Package: libnih1
-+Architecture: any
-+Pre-Depends: ${misc:Pre-Depends}, ${shlibs:Depends}, ${misc:Depends}
-+Multi-Arch: same
-+Description: NIH Utility Library
-+ libnih is a light-weight "standard library" of C functions to ease the
-+ development of other libraries and applications, especially those
-+ normally found in /lib.
-+ .
-+ This package contains the shared library.
-+
-+Package: libnih-dev
-+Priority: optional
-+Section: libdevel
-+Architecture: any
-+Multi-Arch: same
-+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
-+Description: NIH Utility Library (development files)
-+ libnih is a light-weight "standard library" of C functions to ease the
-+ development of other libraries and applications, especially those
-+ normally found in /lib.
-+ .
-+ This package contains the static library and C header files which are
-+ needed for developing software using libnih.
-+
-+Package: libnih-dbus1
-+Architecture: any
-+Pre-Depends: ${misc:Pre-Depends}
-+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
-+Multi-Arch: same
-+Description: NIH D-Bus Bindings Library
-+ libnih-dbus is a D-Bus bindings library that integrates with the main
-+ loop provided by libnih.
-+ .
-+ This package contains the shared library.
-+
-+Package: libnih-dbus-dev
-+Priority: optional
-+Section: libdevel
-+Architecture: any
-+Multi-Arch: same
-+Depends: libnih-dbus1 (= ${binary:Version}), libnih-dev (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
-+Recommends: nih-dbus-tool (= ${binary:Version})
-+Description: NIH D-Bus Bindings Library (development files)
-+ libnih-dbus is a D-Bus bindings library that integrates with the main
-+ loop provided by libnih.
-+ .
-+ This package contains the static library and C header files which are
-+ needed for developing software using libnih-dbus.
-+
-+Package: nih-dbus-tool
-+Section: devel
-+Architecture: any
-+Multi-Arch: foreign
-+Depends: ${shlibs:Depends}, ${misc:Depends}
-+Recommends: libnih-dbus-dev (= ${binary:Version})
-+Description: NIH D-Bus Binding Tool
-+ nih-dbus-tool generates C source code from the D-Bus Introspection XML
-+ data provided by most services; either to make implementing the
-+ described objects in C programs or to make proxying to the described
-+ remote objects easier.
-+ .
-+ The generated code requires libnih-dbus-dev to be compiled.
---- libnih-1.0.3.orig/debian/libnih-dev.install
-+++ libnih-1.0.3/debian/libnih-dev.install
-@@ -0,0 +1,6 @@
-+lib/*/libnih.a
-+lib/*/libnih.so
-+usr/include/libnih.h
-+usr/include/nih
-+usr/lib/*/pkgconfig/libnih.pc
-+usr/share/aclocal/libnih.m4
---- libnih-1.0.3.orig/debian/libnih1.docs
-+++ libnih-1.0.3/debian/libnih1.docs
-@@ -0,0 +1,3 @@
-+AUTHORS
-+NEWS
-+README
---- libnih-1.0.3.orig/debian/libnih-dbus1.install
-+++ libnih-1.0.3/debian/libnih-dbus1.install
-@@ -0,0 +1 @@
-+lib/*/libnih-dbus.so.*
---- libnih-1.0.3.orig/debian/libnih1.install
-+++ libnih-1.0.3/debian/libnih1.install
-@@ -0,0 +1 @@
-+lib/*/libnih.so.*
---- libnih-1.0.3.orig/debian/rules
-+++ libnih-1.0.3/debian/rules
-@@ -0,0 +1,54 @@
-+#!/usr/bin/make -f
-+
-+include /usr/share/dpkg/architecture.mk
-+
-+%:
-+ dh $@ --with autoreconf
-+
-+
-+CFLAGS := -Wall -fstack-protector -fPIE $(shell dpkg-buildflags --get CFLAGS)
-+LDFLAGS := -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -pie $(shell dpkg-buildflags --get LDFLAGS)
-+
-+override_dh_auto_configure:
-+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
-+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
-+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
-+else
-+ dh_auto_configure -B build-dbus-tool/ -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
-+ --libdir=/lib/$(DEB_BUILD_MULTIARCH) \
-+ --host=$(DEB_BUILD_GNU_TYPE)
-+ dh_auto_build -B build-dbus-tool/ --parallel
-+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
-+ NIH_DBUS_TOOL=$(CURDIR)/build-dbus-tool/nih-dbus-tool/nih-dbus-tool \
-+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
-+endif
-+
-+override_dh_auto_build:
-+ dh_auto_build --parallel
-+
-+override_dh_auto_test:
-+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
-+ dh_auto_test --parallel
-+endif
-+
-+override_dh_auto_install:
-+ dh_auto_install -- pkgconfigdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
-+
-+override_dh_makeshlibs:
-+ dh_makeshlibs -plibnih1 -V 'libnih1 (>= 1.0.0)'
-+ dh_makeshlibs -plibnih-dbus1 -V 'libnih-dbus1 (>= 1.0.0)'
-+ dh_makeshlibs -Nlibnih1 -Nlibnih-dbus1
-+
-+override_dh_shlibdeps:
-+ dh_shlibdeps
-+ sed -i 's/2\.14/2.15/' debian/*.substvars
-+ sed -i 's/>= 2.15)/>= 2.15~)/g' debian/*.substvars
-+
-+
-+# Symlink /usr/share/doc directories together
-+override_dh_installdocs:
-+ dh_installdocs --link-doc=libnih1
-+
-+override_dh_clean:
-+ rm -rf build-dbus-tool/
-+ dh_clean
---- libnih-1.0.3.orig/debian/compat
-+++ libnih-1.0.3/debian/compat
-@@ -0,0 +1 @@
-+9
---- libnih-1.0.3.orig/debian/nih-dbus-tool.install
-+++ libnih-1.0.3/debian/nih-dbus-tool.install
-@@ -0,0 +1,2 @@
-+usr/bin/nih-dbus-tool
-+usr/share/man/man1/nih-dbus-tool.1
---- libnih-1.0.3.orig/debian/copyright
-+++ libnih-1.0.3/debian/copyright
-@@ -0,0 +1,18 @@
-+This is the Ubuntu package of libnih, the NIH Utility Library.
-+
-+Copyright © 2009 Canonical Ltd.
-+Copyright © 2009 Scott James Remnant <scott@netsplit.com>
-+
-+Licence:
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License version 2, as
-+published by the Free Software Foundation.
-+
-+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.
-+
-+On Ubuntu systems, the complete text of the GNU General Public License
-+can be found in â/usr/share/common-licenses/GPL-2â.
---- libnih-1.0.3.orig/debian/libnih-dbus1.postinst
-+++ libnih-1.0.3/debian/libnih-dbus1.postinst
-@@ -0,0 +1,53 @@
-+#!/bin/sh
-+
-+set -e
-+
-+if [ "$1" = configure ]; then
-+ # A dependent library of Upstart has changed, so restart Upstart
-+ # such that it can safely unmount the root filesystem (LP: #740390)
-+
-+ # Query running version of Upstart, but only when we know
-+ # that initctl will work.
-+ #
-+ # The calculated version string may be the null string if
-+ # Upstart is not running (where for example an alternative
-+ # init is running outside a chroot environment) or if the
-+ # query failed for some reason. However, the version check
-+ # below handles a null version string correctly.
-+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
-+ awk '{print $3}'|tr -d ')' || :)
-+
-+ if ischroot; then
-+ # Do not honour re-exec when requested from within a
-+ # chroot since:
-+ #
-+ # (a) The version of Upstart outside might not support it.
-+ # (b) An isolated environment such as a chroot should
-+ # not be able to modify its containing environment.
-+ #
-+ # A sufficiently new Upstart will actually handle a re-exec
-+ # request coming from telinit within a chroot correctly (by
-+ # doing nothing) but it's simple enough to perform the check
-+ # here and save Upstart the effort.
-+ :
-+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
-+ # We are not running inside a chroot and the running version
-+ # of Upstart supports stateful re-exec, so we can
-+ # restart immediately.
-+ #
-+ # XXX: Note that the check on the running version must
-+ # remain *indefinitely* since it's the only safe way to
-+ # know if stateful re-exec is supported: simply checking
-+ # packaged version numbers is not sufficient since
-+ # the package could be upgraded multiple times without a
-+ # reboot.
-+ telinit u || :
-+ else
-+ # Before we shutdown or reboot, we need to re-exec so that we
-+ # can safely remount the root filesystem; we can't just do that
-+ # here because we lose state.
-+ touch /var/run/init.upgraded || :
-+ fi
-+fi
-+
-+#DEBHELPER#
---- libnih-1.0.3.orig/debian/changelog.DEBIAN
-+++ libnih-1.0.3/debian/changelog.DEBIAN
-@@ -0,0 +1,118 @@
-+libnih (1.0.3-4) unstable; urgency=low
-+
-+ * Rebuild for new libc to update versioned dependency; this comes from
-+ the __abort_msg dependency, dpkg-shlibs needs overriding since this is
-+ actually a weak link, but this rebuild fixes things for now.
-+ Closes: #625257.
-+
-+ -- Scott James Remnant <scott@netsplit.com> Mon, 02 May 2011 15:08:33 -0700
-+
-+libnih (1.0.3-3) unstable; urgency=low
-+
-+ * New maintainer. Closes: #624442.
-+
-+ -- Scott James Remnant <scott@netsplit.com> Thu, 28 Apr 2011 14:26:05 -0700
-+
-+libnih (1.0.3-2) unstable; urgency=low
-+
-+ * Bump build dependency on libdbus-1-dev and dbus to (>= 1.4) for Unix file
-+ descriptor passing support.
-+
-+ -- Michael Biebl <biebl@debian.org> Thu, 10 Feb 2011 20:25:18 +0100
-+
-+libnih (1.0.3-1ubuntu1) natty; urgency=low
-+
-+ * Rebuild with libc6-dev (>= 2.13~).
-+
-+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
-+
-+libnih (1.0.3-1) unstable; urgency=low
-+
-+ * New upstream release.
-+ * Bump debhelper compatibility level to 8 and update build dependency
-+ accordingly.
-+
-+ -- Michael Biebl <biebl@debian.org> Mon, 07 Feb 2011 22:19:13 +0100
-+
-+libnih (1.0.2-2) unstable; urgency=low
-+
-+ * Install library development files to /usr/lib and not /lib.
-+ * Remove libtool *.la files as there are no reverse dependencies referencing
-+ them.
-+ * Bump Standards-Version to 3.9.1. No further changes.
-+
-+ -- Michael Biebl <biebl@debian.org> Sun, 02 Jan 2011 21:09:40 +0100
-+
-+libnih (1.0.2-1ubuntu3) natty; urgency=low
-+
-+ * Disable some tests on ppc64 to build an initial package.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
-+
-+libnih (1.0.2-1ubuntu2) maverick; urgency=low
-+
-+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
-+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
-+
-+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
-+
-+libnih (1.0.2-1ubuntu1) maverick; urgency=low
-+
-+ * Rebuild with libc6-dev (>= 2.12~), after checking that
-+ __abort_msg is available with the same signature in eglibc 2.12.
-+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
-+
-+libnih (1.0.2-1) unstable; urgency=low
-+
-+ * Initial upload to Debian. Closes: #585071
-+ * Based on the Ubuntu package for Lucid done by Scott James Remnant with the
-+ following changes:
-+ - Switch packages to priority optional.
-+ - Use binary:Version instead of Source-Version.
-+ - Bump Standards-Version to 3.8.4.
-+ - Add Homepage and Vcs-* fields.
-+ - Don't symlink /usr/share/doc directories.
-+ - Refer to versioned /usr/share/common-licenses/GPL-2 file in
-+ debian/copyright.
-+ - List all symbols explicitly instead of using a wildcard and add symbols
-+ introduced in 1.0.1.
-+ - Use the symbols files to create the correct version info instead of
-+ specifying it manually via shlibs.
-+ - Switch to source format 3.0 (quilt).
-+ - Add watch file to track new upstream releases.
-+
-+ -- Michael Biebl <biebl@debian.org> Sun, 13 Jun 2010 23:36:52 +0200
-+
-+libnih (1.0.1-1) lucid; urgency=low
-+
-+ * New upstream release:
-+ - Add missing __nih_* symbols to linker version script so that we
-+ can link Upstart's test suite.
-+ - Glibc __abort_msg symbol now only linked as a weak symbol.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
-+
-+libnih (1.0.0-2build1) lucid; urgency=low
-+
-+ * Rebuild to pick up relaxed dependency on libc6, after checking that
-+ __abort_msg is available with the same signature in eglibc 2.11.
-+ LP: #508702.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
-+
-+libnih (1.0.0-2) lucid; urgency=low
-+
-+ * debian/control: Add build-dependency on dbus so the test suite can
-+ pass on the buildds.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
-+
-+libnih (1.0.0-1) lucid; urgency=low
-+
-+ * First upstream release. Previously this code was included in the
-+ upstart, mountall and ureadahead source packages.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
-+
---- libnih-1.0.3.orig/debian/libnih1.symbols
-+++ libnih-1.0.3/debian/libnih1.symbols
-@@ -0,0 +1,2 @@
-+libnih.so.1 libnih1 #MINVER#
-+ *@LIBNIH_1_0 1.0.0
---- libnih-1.0.3.orig/debian/libnih-dbus-dev.install
-+++ libnih-1.0.3/debian/libnih-dbus-dev.install
-@@ -0,0 +1,5 @@
-+lib/*/libnih-dbus.a
-+lib/*/libnih-dbus.so
-+usr/include/libnih-dbus.h
-+usr/include/nih-dbus
-+usr/lib/*/pkgconfig/libnih-dbus.pc
---- libnih-1.0.3.orig/debian/libnih1.postinst
-+++ libnih-1.0.3/debian/libnih1.postinst
-@@ -0,0 +1,53 @@
-+#!/bin/sh
-+
-+set -e
-+
-+if [ "$1" = configure ]; then
-+ # A dependent library of Upstart has changed, so restart Upstart
-+ # such that it can safely unmount the root filesystem (LP: #740390)
-+
-+ # Query running version of Upstart, but only when we know
-+ # that initctl will work.
-+ #
-+ # The calculated version string may be the null string if
-+ # Upstart is not running (where for example an alternative
-+ # init is running outside a chroot environment) or if the
-+ # query failed for some reason. However, the version check
-+ # below handles a null version string correctly.
-+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
-+ awk '{print $3}'|tr -d ')' || :)
-+
-+ if ischroot; then
-+ # Do not honour re-exec when requested from within a
-+ # chroot since:
-+ #
-+ # (a) The version of Upstart outside might not support it.
-+ # (b) An isolated environment such as a chroot should
-+ # not be able to modify its containing environment.
-+ #
-+ # A sufficiently new Upstart will actually handle a re-exec
-+ # request coming from telinit within a chroot correctly (by
-+ # doing nothing) but it's simple enough to perform the check
-+ # here and save Upstart the effort.
-+ :
-+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
-+ # We are not running inside a chroot and the running version
-+ # of Upstart supports stateful re-exec, so we can
-+ # restart immediately.
-+ #
-+ # XXX: Note that the check on the running version must
-+ # remain *indefinitely* since it's the only safe way to
-+ # know if stateful re-exec is supported: simply checking
-+ # packaged version numbers is not sufficient since
-+ # the package could be upgraded multiple times without a
-+ # reboot.
-+ telinit u || :
-+ else
-+ # Before we shutdown or reboot, we need to re-exec so that we
-+ # can safely remount the root filesystem; we can't just do that
-+ # here because we lose state.
-+ touch /var/run/init.upgraded || :
-+ fi
-+fi
-+
-+#DEBHELPER#
---- libnih-1.0.3.orig/debian/libnih-dbus1.symbols
-+++ libnih-1.0.3/debian/libnih-dbus1.symbols
-@@ -0,0 +1,2 @@
-+libnih-dbus.so.1 libnih-dbus1 #MINVER#
-+ *@LIBNIH_DBUS_1_0 1.0.0
---- libnih-1.0.3.orig/debian/changelog
-+++ libnih-1.0.3/debian/changelog
-@@ -0,0 +1,213 @@
-+libnih (1.0.3-4ubuntu16) raring; urgency=low
-+
-+ * debian/{libnih1.postinst,libnih-dbus1.postinst}: Force an upgrade to
-+ restart Upstart (to pick up new package version) if the running
-+ instance supports it.
-+ * Merge of important fixes from lp:~upstart-devel/libnih/nih
-+ (LP: #776532, LP: #777097, LP: #834813, LP: #1123588).
-+
-+ -- James Hunt <james.hunt@ubuntu.com> Thu, 14 Mar 2013 09:14:22 +0000
-+
-+libnih (1.0.3-4ubuntu15) raring; urgency=low
-+
-+ * Enable cross-building, sans adding :native build-dependencies.
-+ See comments in debian/control.
-+ * Lintian fixes.
-+
-+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 08 Jan 2013 15:38:58 +0000
-+
-+libnih (1.0.3-4ubuntu14) raring; urgency=low
-+
-+ * Update dbus code generator to allow for empty lists for type 'as'.
-+ This drops the != NULL check for NULL terminated arrays and moves the
-+ iteration loop inside an 'if' statement.
-+
-+ -- Stéphane Graber <stgraber@ubuntu.com> Thu, 13 Dec 2012 10:00:27 -0500
-+
-+libnih (1.0.3-4ubuntu13) raring; urgency=low
-+
-+ [ Petr Lautrbach <plautrba@redhat.com>, Dmitrijs Ledkovs ]
-+ * Fallback to lstat, if dirent.d_type is not available (not portable)
-+ (LP: #672643) (Closes: #695604)
-+
-+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 11 Dec 2012 17:26:52 +0000
-+
-+libnih (1.0.3-4ubuntu12) raring; urgency=low
-+
-+ * nih/logging.c: Use our own __nih_abort_msg rather than the (e)glibc
-+ private symbol __abort_msg to avoid upgrade issues (LP: #997359).
-+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
-+
-+ -- James Hunt <james.hunt@ubuntu.com> Thu, 25 Oct 2012 10:57:30 +0100
-+
-+libnih (1.0.3-4ubuntu11) quantal; urgency=low
-+
-+ * Addition of debian/libnih-dbus1.postinst and
-+ debian/libnih1.postinst to force Upstart re-exec on shutdown
-+ to avoid unmounting disks uncleanly (LP: #740390).
-+
-+ -- James Hunt <james.hunt@ubuntu.com> Wed, 03 Oct 2012 16:49:40 +0100
-+
-+libnih (1.0.3-4ubuntu10) quantal; urgency=low
-+
-+ * Update config.guess,sub for aarch64
-+
-+ -- Wookey <wookey@wookware.org> Mon, 01 Oct 2012 12:57:05 +0100
-+
-+libnih (1.0.3-4ubuntu9) precise; urgency=low
-+
-+ * Mark the nih-dbus-tool package Multi-Arch: foreign so it can be used as
-+ a build-dependency of upstart when cross-building.
-+
-+ -- Steve Langasek <steve.langasek@ubuntu.com> Wed, 15 Feb 2012 22:57:50 -0800
-+
-+libnih (1.0.3-4ubuntu8) precise; urgency=low
-+
-+ * libnih1 needs a versioned Pre-Depend on libc6 instead of just a Depend,
-+ because libc6 itself uses runlevel from the upstart package in its
-+ preinst, which in turn uses libnih1, which needs to be loadable (i.e.,
-+ its symbol references resolve). We therefore need to ensure that
-+ libnih1's dependencies are always unpacked before libnih1 itself is
-+ unpacked. While having something further up the stack (such as upstart,
-+ or something on top of upstart) being marked Essential: yes and with the
-+ necessary pre-depends would let apt handle this for us with its
-+ "immediate configuration" support, but for various reasons we don't want
-+ to make upstart essential. LP: #508083.
-+
-+ -- Steve Langasek <steve.langasek@ubuntu.com> Fri, 10 Feb 2012 12:13:25 -0800
-+
-+libnih (1.0.3-4ubuntu7) precise; urgency=low
-+
-+ * Relax dependency on libc6.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 23:43:21 +0100
-+
-+libnih (1.0.3-4ubuntu6) precise; urgency=low
-+
-+ * Rebuild with libc6-dev (>= 2.15~).
-+
-+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 21:48:57 +0100
-+
-+libnih (1.0.3-4ubuntu5) precise; urgency=low
-+
-+ * Mark libnih-dev and libnih-dbus-dev Multi-Arch: same as well.
-+
-+ -- Steve Langasek <steve.langasek@ubuntu.com> Sun, 06 Nov 2011 14:45:07 -0800
-+
-+libnih (1.0.3-4ubuntu4) precise; urgency=low
-+
-+ * Make libnih1 and libnih-dbus1 installable using multi-arch.
-+
-+ -- James Hunt <james.hunt@ubuntu.com> Tue, 01 Nov 2011 14:25:09 -0400
-+
-+libnih (1.0.3-4ubuntu3) precise; urgency=low
-+
-+ * Build to install with eglibc-2.15.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Fri, 14 Oct 2011 14:05:03 +0200
-+
-+libnih (1.0.3-4ubuntu2) oneiric; urgency=low
-+
-+ * Use dpkg-buildflags to get the build flags.
-+ * Build with the default build flags, don't hard-code -Os. LP: #791315.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Wed, 15 Jun 2011 16:45:42 +0200
-+
-+libnih (1.0.3-4ubuntu1) oneiric; urgency=low
-+
-+ * Merge from debian unstable. Retained Ubuntu Build-Depends and Priority.
-+
-+ -- James Hunt <james.hunt@ubuntu.com> Mon, 23 May 2011 19:28:19 +0100
-+
-+libnih (1.0.3-1ubuntu1) natty; urgency=low
-+
-+ * Rebuild with libc6-dev (>= 2.13~).
-+
-+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
-+
-+libnih (1.0.3-1) natty; urgency=low
-+
-+ * New upstream release:
-+ - Added support for passing file descriptors over D-Bus to nih-dbus-tool
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Thu, 23 Dec 2010 22:28:24 +0000
-+
-+libnih (1.0.2-2) natty; urgency=low
-+
-+ * Revert the previous upload. It is never acceptable to simply disable
-+ tests, especially when it turns out that the test that was disabled
-+ was failing because there was a serious bug that could cause kernel
-+ panics for people on boot.
-+
-+ Test suites are here for a reason.
-+
-+ * Bumped libdbus Build-Dependency to the version with the bug fix that
-+ caused the test suite to fail.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Wed, 08 Dec 2010 19:40:15 +0000
-+
-+libnih (1.0.2-1ubuntu3) natty; urgency=low
-+
-+ * Disable some tests on ppc64 to build an initial package.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
-+
-+libnih (1.0.2-1ubuntu2) maverick; urgency=low
-+
-+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
-+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
-+
-+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
-+
-+libnih (1.0.2-1ubuntu1) maverick; urgency=low
-+
-+ * Rebuild with libc6-dev (>= 2.12~), after checking that
-+ __abort_msg is available with the same signature in eglibc 2.12.
-+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
-+
-+libnih (1.0.2-1) maverick; urgency=low
-+
-+ * New upstream release:
-+ - Rename AC_COPYRIGHT to NIH_COPYRIGHT to avoid conflict with other
-+ packages.
-+ - Add serial to libnih.m4
-+ - Add NIH_WITH_LOCAL_LIBNIH macro.
-+
-+ * Fix use of ${Source-Version} to be ${binary:Version}
-+ * Add debian/source/format with "1.0" to be future compatible.
-+ * Bump standards version.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Tue, 27 Apr 2010 10:49:55 -0700
-+
-+libnih (1.0.1-1) lucid; urgency=low
-+
-+ * New upstream release:
-+ - Add missing __nih_* symbols to linker version script so that we
-+ can link Upstart's test suite.
-+ - Glibc __abort_msg symbol now only linked as a weak symbol.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
-+
-+libnih (1.0.0-2build1) lucid; urgency=low
-+
-+ * Rebuild to pick up relaxed dependency on libc6, after checking that
-+ __abort_msg is available with the same signature in eglibc 2.11.
-+ LP: #508702.
-+
-+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
-+
-+libnih (1.0.0-2) lucid; urgency=low
-+
-+ * debian/control: Add build-dependency on dbus so the test suite can
-+ pass on the buildds.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
-+
-+libnih (1.0.0-1) lucid; urgency=low
-+
-+ * First upstream release. Previously this code was included in the
-+ upstart, mountall and ureadahead source packages.
-+
-+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
---- libnih-1.0.3.orig/debian/source/format
-+++ libnih-1.0.3/debian/source/format
-@@ -0,0 +1 @@
-+1.0
---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.h
-+++ libnih-1.0.3/nih-dbus/dbus_proxy.h
-@@ -146,14 +146,14 @@
- const char *name, const char *path,
- NihDBusLostHandler lost_handler,
- void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
- const NihDBusInterface *interface,
- const char *name,
- NihDBusSignalHandler handler,
- void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus/dbus_object.h
-+++ libnih-1.0.3/nih-dbus/dbus_object.h
-@@ -61,8 +61,7 @@
- DBusConnection *connection,
- const char *path,
- const NihDBusInterface **interfaces,
-- void *data)
-- __attribute__ ((malloc));
-+ void *data);
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus/dbus_util.h
-+++ libnih-1.0.3/nih-dbus/dbus_util.h
-@@ -26,7 +26,7 @@
- NIH_BEGIN_EXTERN
-
- char *nih_dbus_path (const void *parent, const char *root, ...)
-- __attribute__ ((sentinel, warn_unused_result, malloc));
-+ __attribute__ ((sentinel, warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus/dbus_pending_data.h
-+++ libnih-1.0.3/nih-dbus/dbus_pending_data.h
-@@ -104,7 +104,7 @@
- NihDBusReplyHandler handler,
- NihDBusErrorHandler error_handler,
- void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.c
-+++ libnih-1.0.3/nih-dbus/dbus_proxy.c
-@@ -46,11 +46,11 @@
- __attribute__ ((warn_unused_result));
- static char *nih_dbus_proxy_name_rule (const void *parent,
- NihDBusProxy *proxy)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static int nih_dbus_proxy_signal_destroy (NihDBusProxySignal *proxied);
- static char *nih_dbus_proxy_signal_rule (const void *parent,
- NihDBusProxySignal *proxied)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- /* Prototypes for handler functions */
- static DBusHandlerResult nih_dbus_proxy_name_owner_changed (DBusConnection *connection,
---- libnih-1.0.3.orig/nih-dbus-tool/symbol.c
-+++ libnih-1.0.3/nih-dbus-tool/symbol.c
-@@ -40,10 +40,10 @@
- /* Prototypes for static functions */
- static char *symbol_strcat_interface (char **str, const void *parent,
- const char *format, ...)
-- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
- static char *symbol_strcat_title (char **str, const void *parent,
- const char *format, ...)
-- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
-+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
-
-
- /**
---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.h
-+++ libnih-1.0.3/nih-dbus-tool/demarshal.h
-@@ -37,7 +37,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/symbol.h
-+++ libnih-1.0.3/nih-dbus-tool/symbol.h
-@@ -28,22 +28,22 @@
- int symbol_valid (const char *symbol);
-
- char *symbol_from_name (const void *parent, const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char *symbol_impl (const void *parent, const char *prefix,
- const char *interface_name, const char *name,
- const char *postfix)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char *symbol_extern (const void *parent, const char *prefix,
- const char *interface_symbol, const char *midfix,
- const char *symbol, const char *postfix)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char *symbol_typedef (const void *parent, const char *prefix,
- const char *interface_symbol, const char *midfix,
- const char *symbol, const char *postfix)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/output.h
-+++ libnih-1.0.3/nih-dbus-tool/output.h
-@@ -35,9 +35,9 @@
- __attribute__ ((warn_unused_result));
-
- char *output_preamble (const void *parent, const char *path)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char *output_sentinel (const void *parent, const char *path)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/parse.h
-+++ libnih-1.0.3/nih-dbus-tool/parse.h
-@@ -95,7 +95,7 @@
-
- ParseStack *parse_stack_push (const void *parent, NihList *stack,
- ParseStackType type, void *data)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- ParseStack *parse_stack_top (NihList *stack);
-
- void parse_start_tag (XML_Parser xmlp, const char *tag,
-@@ -103,7 +103,7 @@
- void parse_end_tag (XML_Parser xmlp, const char *tag);
-
- Node * parse_xml (const void *parent, int fd, const char *filename)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/type.h
-+++ libnih-1.0.3/nih-dbus-tool/type.h
-@@ -94,43 +94,43 @@
-
- char * type_of (const void * parent,
- DBusSignatureIter *iter)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- TypeVar * type_var_new (const void *parent, const char *type,
- const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_var_to_string (const void *parent, TypeVar *var)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_var_layout (const void *parent, NihList *vars)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- TypeFunc * type_func_new (const void *parent, const char *type,
- const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_func_to_string (const void *parent, TypeFunc *func)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_func_to_typedef (const void *parent, TypeFunc *func)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_func_layout (const void *parent, NihList *funcs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- TypeStruct *type_struct_new (const void *parent, const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_struct_to_string (const void *parent, TypeStruct *structure)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * type_to_const (char **type, const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_to_pointer (char **type, const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_to_static (char **type, const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * type_to_extern (char **type, const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * type_strcat_assert (char **block, const void *parent,
- TypeVar *var, TypeVar *prev, TypeVar *next)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/argument.h
-+++ libnih-1.0.3/nih-dbus-tool/argument.h
-@@ -61,7 +61,7 @@
-
- Argument *argument_new (const void *parent, const char *name,
- const char *type, NihDBusArgDir direction)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int argument_start_tag (XML_Parser xmlp, const char *tag,
- char * const *attr)
---- libnih-1.0.3.orig/nih-dbus-tool/indent.h
-+++ libnih-1.0.3/nih-dbus-tool/indent.h
-@@ -26,9 +26,9 @@
- NIH_BEGIN_EXTERN
-
- char *indent (char **str, const void *parent, int level)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char *comment (char **str, const void *parent)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/main.c
-+++ libnih-1.0.3/nih-dbus-tool/main.c
-@@ -52,10 +52,10 @@
- /* Prototypes for local functions */
- char *source_file_path (const void *parent, const char *output_path,
- const char *filename)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char *header_file_path (const void *parent, const char *output_path,
- const char *filename)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
-
- /**
---- libnih-1.0.3.orig/nih-dbus-tool/signal.h
-+++ libnih-1.0.3/nih-dbus-tool/signal.h
-@@ -58,7 +58,7 @@
- int signal_name_valid (const char *name);
-
- Signal * signal_new (const void *parent, const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int signal_start_tag (XML_Parser xmlp, const char *tag,
- char * const *attr)
-@@ -76,18 +76,18 @@
- char * signal_object_function (const void *parent, const char *prefix,
- Interface *interface, Signal *signal,
- NihList *prototypes, NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * signal_proxy_function (const void *parent, const char *prefix,
- Interface *interface, Signal *signal,
- NihList *prototypes, NihList *typedefs,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * signal_args_array (const void *parent, const char *prefix,
- Interface *interface, Signal *signal,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
-+++ libnih-1.0.3/nih-dbus-tool/marshal.c
-@@ -49,7 +49,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static char *marshal_array (const void *parent,
- DBusSignatureIter *iter,
- const char *iter_name, const char *name,
-@@ -58,7 +58,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static char *marshal_struct (const void *parent,
- DBusSignatureIter *iter,
- const char *iter_name, const char *name,
-@@ -67,7 +67,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
-
- /**
-@@ -364,6 +364,7 @@
- nih_local TypeVar *element_len_var = NULL;
- nih_local char * block = NULL;
- nih_local char * vars_block = NULL;
-+ nih_local char * loop_block = NULL;
-
- nih_assert (iter != NULL);
- nih_assert (iter_name != NULL);
-@@ -448,7 +449,7 @@
- nih_list_add (locals, &array_iter_var->entry);
-
- if (dbus_type_is_fixed (element_type)) {
-- if (! nih_strcat_sprintf (&code, parent,
-+ if (! nih_strcat_sprintf (&loop_block, parent,
- "for (size_t %s = 0; %s < %s; %s++) {\n",
- loop_name, loop_name, len_name, loop_name)) {
- nih_free (code);
-@@ -456,6 +457,12 @@
- }
- } else {
- if (! nih_strcat_sprintf (&code, parent,
-+ "if (%s) {\n",
-+ name)) {
-+ nih_free (code);
-+ return NULL;
-+ }
-+ if (! nih_strcat_sprintf (&loop_block, parent,
- "for (size_t %s = 0; %s[%s]; %s++) {\n",
- loop_name, name, loop_name, loop_name)) {
- nih_free (code);
-@@ -576,7 +583,7 @@
- }
-
-
-- if (! nih_strcat_sprintf (&code, parent,
-+ if (! nih_strcat_sprintf (&loop_block, parent,
- "%s"
- "\n"
- "%s"
-@@ -590,9 +597,34 @@
- }
-
- /* Close the container again */
-+ if (! nih_strcat_sprintf (&loop_block, parent,
-+ "}\n")) {
-+ nih_free (code);
-+ return NULL;
-+ }
-+
-+ if (dbus_type_is_fixed (element_type)) {
-+ if (! nih_strcat_sprintf (&code, parent,
-+ "%s\n", loop_block)) {
-+ nih_free (code);
-+ return NULL;
-+ }
-+ }
-+ else {
-+ if (! indent (&loop_block, NULL, 1)) {
-+ nih_free (code);
-+ return NULL;
-+ }
-+
-+ if (! nih_strcat_sprintf (&code, parent,
-+ "%s"
-+ "}\n\n", loop_block)) {
-+ nih_free (code);
-+ return NULL;
-+ }
-+ }
-+
- if (! nih_strcat_sprintf (&code, parent,
-- "}\n"
-- "\n"
- "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
- "%s"
- "}\n",
---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.c
-+++ libnih-1.0.3/nih-dbus-tool/demarshal.c
-@@ -51,7 +51,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static char *demarshal_array (const void *parent,
- DBusSignatureIter *iter,
- const char *parent_name,
-@@ -62,7 +62,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- static char *demarshal_struct (const void *parent,
- DBusSignatureIter *iter,
- const char *parent_name,
-@@ -73,7 +73,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
-
- /**
---- libnih-1.0.3.orig/nih-dbus-tool/interface.h
-+++ libnih-1.0.3/nih-dbus-tool/interface.h
-@@ -61,7 +61,7 @@
-
- Interface *interface_new (const void *parent,
- const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int interface_start_tag (XML_Parser xmlp,
- const char *tag,
-@@ -81,26 +81,26 @@
- Interface *interface,
- int with_handlers,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * interface_signals_array (const void *parent,
- const char *prefix,
- Interface *interface,
- int with_filters,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * interface_properties_array (const void *parent,
- const char *prefix,
- Interface *interface,
- int with_handlers,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * interface_struct (const void *parent,
- const char *prefix,
- Interface *interface,
- int object,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
-
- char * interface_proxy_get_all_function (const void *parent,
-@@ -108,7 +108,7 @@
- Interface *interface,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * interface_proxy_get_all_notify_function (const void *parent,
- const char *prefix,
-@@ -116,14 +116,14 @@
- NihList *prototypes,
- NihList *typedefs,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * interface_proxy_get_all_sync_function (const void *parent,
- const char *prefix,
- Interface *interface,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/method.h
-+++ libnih-1.0.3/nih-dbus-tool/method.h
-@@ -62,7 +62,7 @@
- int method_name_valid (const char *name);
-
- Method * method_new (const void *parent, const char *name)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int method_start_tag (XML_Parser xmlp, const char *tag,
- char * const *attr)
-@@ -82,33 +82,33 @@
- Interface *interface, Method *method,
- NihList *prototypes, NihList *handlers,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * method_reply_function (const void *parent, const char *prefix,
- Interface *interface, Method *method,
- NihList *prototypes, NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * method_proxy_function (const void *parent, const char *prefix,
- Interface *interface, Method *method,
- NihList *prototypes, NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * method_proxy_notify_function (const void *parent, const char *prefix,
- Interface *interface, Method *method,
- NihList *prototypes, NihList *typedefs,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * method_proxy_sync_function (const void *parent, const char *prefix,
- Interface *interface, Method *method,
- NihList *prototypes, NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * method_args_array (const void *parent, const char *prefix,
- Interface *interface, Method *method,
- NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/node.h
-+++ libnih-1.0.3/nih-dbus-tool/node.h
-@@ -47,7 +47,7 @@
- int node_path_valid (const char *name);
-
- Node * node_new (const void *parent, const char *path)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int node_start_tag (XML_Parser xmlp, const char *tag,
- char * const *attr)
-@@ -59,18 +59,18 @@
-
- char * node_interfaces_array (const void *parent, const char *prefix,
- Node *node, int object, NihList *prototypes)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * node_object_functions (const void *parent, const char *prefix,
- Node *node,
- NihList *prototypes, NihList *handlers,
- NihList *structs, NihList *externs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * node_proxy_functions (const void *parent, const char *prefix,
- Node *node,
- NihList *prototypes, NihList *structs,
- NihList *typedefs, NihList *externs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/marshal.h
-+++ libnih-1.0.3/nih-dbus-tool/marshal.h
-@@ -35,7 +35,7 @@
- const char *prefix, const char *interface_symbol,
- const char *member_symbol, const char *symbol,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/type.c
-+++ libnih-1.0.3/nih-dbus-tool/type.c
-@@ -1101,7 +1101,7 @@
- nih_assert (block != NULL);
- nih_assert (var != NULL);
-
-- if (! strchr (var->type, '*'))
-+ if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
- return *block;
-
- if (next && (! strcmp (next->type, "size_t"))) {
---- libnih-1.0.3.orig/nih-dbus-tool/property.h
-+++ libnih-1.0.3/nih-dbus-tool/property.h
-@@ -65,7 +65,7 @@
- const char *name,
- const char *type,
- NihDBusAccess access)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- int property_start_tag (XML_Parser xmlp, const char *tag,
- char * const *attr)
-@@ -88,7 +88,7 @@
- NihList *prototypes,
- NihList *handlers,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * property_object_set_function (const void *parent,
- const char *prefix,
- Interface *interface,
-@@ -96,7 +96,7 @@
- NihList *prototypes,
- NihList *handlers,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * property_proxy_get_function (const void *parent,
- const char *prefix,
-@@ -104,7 +104,7 @@
- Property *property,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * property_proxy_get_notify_function (const void *parent,
- const char *prefix,
- Interface *interface,
-@@ -112,7 +112,7 @@
- NihList *prototypes,
- NihList *typedefs,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * property_proxy_set_function (const void *parent,
- const char *prefix,
-@@ -120,7 +120,7 @@
- Property *property,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * property_proxy_set_notify_function (const void *parent,
- const char *prefix,
- Interface *interface,
-@@ -128,7 +128,7 @@
- NihList *prototypes,
- NihList *typedefs,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- char * property_proxy_get_sync_function (const void *parent,
- const char *prefix,
-@@ -136,14 +136,14 @@
- Property *property,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- char * property_proxy_set_sync_function (const void *parent,
- const char *prefix,
- Interface *interface,
- Property *property,
- NihList *prototypes,
- NihList *structs)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- NIH_END_EXTERN
-
---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_main.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/test_main.c
-@@ -100,10 +100,10 @@
-
- extern char *source_file_path (const void *parent, const char *output_path,
- const char *filename)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
- extern char *header_file_path (const void *parent, const char *output_path,
- const char *filename)
-- __attribute__ ((warn_unused_result, malloc));
-+ __attribute__ ((warn_unused_result));
-
- void
- test_source_file_path (void)
---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
-@@ -12524,6 +12524,7 @@
- dbus_message_iter_init (reply, &iter);
-
- dbus_message_iter_get_basic (&iter, &str_value);
-+ TEST_NE (str_value[0], '\0');
- TEST_TRUE (strchr ("0123456789", str_value[0]));
-
- dbus_message_unref (reply);
---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
-@@ -1479,39 +1479,41 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-- "\tDBusMessageIter value_element_iter;\n"
-- "\tconst int16_t * value_element;\n"
-- "\tsize_t value_element_len;\n"
-+ "if (value) {\n"
-+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
-+ "\t\tDBusMessageIter value_element_iter;\n"
-+ "\t\tconst int16_t * value_element;\n"
-+ "\t\tsize_t value_element_len;\n"
- "\n"
-- "\tvalue_element = value[value_i];\n"
-- "\tvalue_element_len = value_len[value_i];\n"
-+ "\t\tvalue_element = value[value_i];\n"
-+ "\t\tvalue_element_len = value_len[value_i];\n"
- "\n"
-
-- "\t/* Marshal an array onto the message */\n"
-- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal an array onto the message */\n"
-+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
-- "\t\tint16_t value_element_element;\n"
-+ "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
-+ "\t\t\tint16_t value_element_element;\n"
- "\n"
-- "\t\tvalue_element_element = value_element[value_element_i];\n"
-+ "\t\t\tvalue_element_element = value_element[value_element_i];\n"
- "\n"
-- "\t\t/* Marshal a int16_t onto the message */\n"
-- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
-- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\t/* Marshal a int16_t onto the message */\n"
-+ "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
-+ "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\t\treturn -1;\n"
-+ "\t\t\t}\n"
-+ "\t\t}\n"
-+ "\n"
-+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
- "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
- "\t\t\treturn -1;\n"
- "\t\t}\n"
-- "\t}\n"
-- "\n"
-- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-
-+ "\t}\n"
- "}\n"
- "\n"
- "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
-@@ -1766,15 +1768,17 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-- "\tconst char *value_element;\n"
-+ "if (value) {\n"
-+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
-+ "\t\tconst char *value_element;\n"
- "\n"
-- "\tvalue_element = value[value_i];\n"
-+ "\t\tvalue_element = value[value_i];\n"
- "\n"
-- "\t/* Marshal a char * onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-+ "\t\t/* Marshal a char * onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
-@@ -1933,35 +1937,39 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-- "\tDBusMessageIter value_element_iter;\n"
-- "\tchar * const * value_element;\n"
-+ "if (value) {\n"
-+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
-+ "\t\tDBusMessageIter value_element_iter;\n"
-+ "\t\tchar * const * value_element;\n"
- "\n"
-- "\tvalue_element = value[value_i];\n"
-+ "\t\tvalue_element = value[value_i];\n"
- "\n"
-- "\t/* Marshal an array onto the message */\n"
-- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-- "\n"
-- "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
-- "\t\tconst char *value_element_element;\n"
-+ "\t\t/* Marshal an array onto the message */\n"
-+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\t\tvalue_element_element = value_element[value_element_i];\n"
-+ "\t\tif (value_element) {\n"
-+ "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
-+ "\t\t\t\tconst char *value_element_element;\n"
-+ "\n"
-+ "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
-+ "\n"
-+ "\t\t\t\t/* Marshal a char * onto the message */\n"
-+ "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
-+ "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\t\t\treturn -1;\n"
-+ "\t\t\t\t}\n"
-+ "\t\t\t}\n"
-+ "\t\t}\n"
- "\n"
-- "\t\t/* Marshal a char * onto the message */\n"
-- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
-- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
- "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
- "\t\t\treturn -1;\n"
- "\t\t}\n"
- "\t}\n"
-- "\n"
-- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
- "}\n"
- "\n"
- "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
-@@ -2194,16 +2202,18 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
-- "\tconst char *value_item2_element;\n"
-+ "if (value_item2) {\n"
-+ "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
-+ "\t\tconst char *value_item2_element;\n"
- "\n"
-- "\tvalue_item2_element = value_item2[value_item2_i];\n"
-+ "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
- "\n"
-- "\t/* Marshal a char * onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-+ "\t\t/* Marshal a char * onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
-@@ -2642,41 +2652,43 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-- "\tDBusMessageIter value_element_iter;\n"
-- "\tconst char * value_element_item0;\n"
-- "\tuint32_t value_element_item1;\n"
-- "\tconst MyStructArrayValueElement *value_element;\n"
-+ "if (value) {\n"
-+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
-+ "\t\tDBusMessageIter value_element_iter;\n"
-+ "\t\tconst char * value_element_item0;\n"
-+ "\t\tuint32_t value_element_item1;\n"
-+ "\t\tconst MyStructArrayValueElement *value_element;\n"
- "\n"
-- "\tvalue_element = value[value_i];\n"
-+ "\t\tvalue_element = value[value_i];\n"
- "\n"
-- "\t/* Marshal a structure onto the message */\n"
-- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a structure onto the message */\n"
-+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tvalue_element_item0 = value_element->item0;\n"
-+ "\t\tvalue_element_item0 = value_element->item0;\n"
- "\n"
-- "\t/* Marshal a char * onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a char * onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tvalue_element_item1 = value_element->item1;\n"
-+ "\t\tvalue_element_item1 = value_element->item1;\n"
- "\n"
-- "\t/* Marshal a uint32_t onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a uint32_t onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
-@@ -2912,41 +2924,43 @@
- "\treturn -1;\n"
- "}\n"
- "\n"
-- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
-- "\tDBusMessageIter value_element_iter;\n"
-- "\tconst char * value_element_item0;\n"
-- "\tuint32_t value_element_item1;\n"
-- "\tconst MyDictEntryArrayValueElement *value_element;\n"
-+ "if (value) {\n"
-+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
-+ "\t\tDBusMessageIter value_element_iter;\n"
-+ "\t\tconst char * value_element_item0;\n"
-+ "\t\tuint32_t value_element_item1;\n"
-+ "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
- "\n"
-- "\tvalue_element = value[value_i];\n"
-+ "\t\tvalue_element = value[value_i];\n"
- "\n"
-- "\t/* Marshal a structure onto the message */\n"
-- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a structure onto the message */\n"
-+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tvalue_element_item0 = value_element->item0;\n"
-+ "\t\tvalue_element_item0 = value_element->item0;\n"
- "\n"
-- "\t/* Marshal a char * onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a char * onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tvalue_element_item1 = value_element->item1;\n"
-+ "\t\tvalue_element_item1 = value_element->item1;\n"
- "\n"
-- "\t/* Marshal a uint32_t onto the message */\n"
-- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-- "\t}\n"
-+ "\t\t/* Marshal a uint32_t onto the message */\n"
-+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\n"
-- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-- "\t\treturn -1;\n"
-+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
-+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
-+ "\t\t\treturn -1;\n"
-+ "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
-@@ -27359,6 +27359,7 @@
- TEST_TRUE (unix_fd_to_str_replied);
-
- TEST_EQ_P (last_data, parent);
-+ TEST_NE (last_str_value[0], '\0');
- TEST_TRUE (strchr ("0123456789", last_str_value[0]));
- TEST_ALLOC_PARENT (last_str_value, parent);
-
-@@ -27673,6 +27674,7 @@
-
- TEST_EQ (ret, 0);
-
-+ TEST_NE (str_value[0], '\0');
- TEST_TRUE (strchr ("0123456789", str_value[0]));
- TEST_ALLOC_PARENT (str_value, parent);
-
---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_property.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/test_property.c
-@@ -8733,7 +8733,7 @@
- TypeVar * var;
- NihListEntry * attrib;
- NihDBusProxy * proxy = NULL;
-- void * parent = NULL;
-+ void * parent __attribute__((unused)) = NULL;
- pid_t pid = -1;
- int status;
- DBusMessage * method_call;
---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
-@@ -136,17 +136,19 @@
- goto enomem;
- }
-
-- for (size_t output_i = 0; output[output_i]; output_i++) {
-- const char *output_element;
-+ if (output) {
-+ for (size_t output_i = 0; output[output_i]; output_i++) {
-+ const char *output_element;
-
-- output_element = output[output_i];
-+ output_element = output[output_i];
-
-- /* Marshal a char * onto the message */
-- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-- dbus_message_iter_abandon_container (&iter, &output_iter);
-- dbus_message_unref (reply);
-- reply = NULL;
-- goto enomem;
-+ /* Marshal a char * onto the message */
-+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-+ dbus_message_iter_abandon_container (&iter, &output_iter);
-+ dbus_message_unref (reply);
-+ reply = NULL;
-+ goto enomem;
-+ }
- }
- }
-
---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
-@@ -7,7 +7,6 @@
- DBusMessageIter output_iter;
-
- nih_assert (message != NULL);
-- nih_assert (output != NULL);
-
- /* If the sender doesn't care about a reply, don't bother wasting
- * effort constructing and sending one.
-@@ -28,16 +27,18 @@
- return -1;
- }
-
-- for (size_t output_i = 0; output[output_i]; output_i++) {
-- const char *output_element;
--
-- output_element = output[output_i];
--
-- /* Marshal a char * onto the message */
-- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-- dbus_message_iter_abandon_container (&iter, &output_iter);
-- dbus_message_unref (reply);
-- return -1;
-+ if (output) {
-+ for (size_t output_i = 0; output[output_i]; output_i++) {
-+ const char *output_element;
-+
-+ output_element = output[output_i];
-+
-+ /* Marshal a char * onto the message */
-+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-+ dbus_message_iter_abandon_container (&iter, &output_iter);
-+ dbus_message_unref (reply);
-+ return -1;
-+ }
- }
- }
-
---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
-@@ -7,7 +7,6 @@
- DBusMessageIter output_iter;
-
- nih_assert (message != NULL);
-- nih_assert (output != NULL);
-
- /* If the sender doesn't care about a reply, don't bother wasting
- * effort constructing and sending one.
-@@ -28,16 +27,18 @@
- return -1;
- }
-
-- for (size_t output_i = 0; output[output_i]; output_i++) {
-- const char *output_element;
--
-- output_element = output[output_i];
--
-- /* Marshal a char * onto the message */
-- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-- dbus_message_iter_abandon_container (&iter, &output_iter);
-- dbus_message_unref (reply);
-- return -1;
-+ if (output) {
-+ for (size_t output_i = 0; output[output_i]; output_i++) {
-+ const char *output_element;
-+
-+ output_element = output[output_i];
-+
-+ /* Marshal a char * onto the message */
-+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-+ dbus_message_iter_abandon_container (&iter, &output_iter);
-+ dbus_message_unref (reply);
-+ return -1;
-+ }
- }
- }
-
---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
-+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
-@@ -88,17 +88,19 @@
- goto enomem;
- }
-
-- for (size_t output_i = 0; output[output_i]; output_i++) {
-- const char *output_element;
-+ if (output) {
-+ for (size_t output_i = 0; output[output_i]; output_i++) {
-+ const char *output_element;
-
-- output_element = output[output_i];
-+ output_element = output[output_i];
-
-- /* Marshal a char * onto the message */
-- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-- dbus_message_iter_abandon_container (&iter, &output_iter);
-- dbus_message_unref (reply);
-- reply = NULL;
-- goto enomem;
-+ /* Marshal a char * onto the message */
-+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
-+ dbus_message_iter_abandon_container (&iter, &output_iter);
-+ dbus_message_unref (reply);
-+ reply = NULL;
-+ goto enomem;
-+ }
- }
- }
-
diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
deleted file mode 100644
index ff7a4ed10..000000000
--- a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2013 LG Electronics, Inc.
-
-SUMMARY = "libnih library"
-HOMEPAGE = "https://launchpad.net/libnih"
-DESCRIPTION = "libnih is a small library for C application development \
- containing functions that, despite its name, are not implemented \
- elsewhere in the standard library set. \
- \
- libnih is roughly equivalent to other C libraries such as glib, \
- except that its focus is on a small size and intended for \
- applications that sit very low in the software stack, especially \
- outside of /usr. \
- \
- It expressly does not reimplement functions that already exist in \
- libraries ordinarily shipped in /lib such libc6, and does not do \
- foolish things like invent arbitrary typedefs for perfectly good C types."
-
-SECTION = "libs"
-
-LICENSE = "GPL-2.0"
-LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
-
-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 gettext
-
-do_configure_append () {
- sed -i -e 's,lib/pkgconfig,${baselib}/pkgconfig,g' ${S}/nih/Makefile.in ${S}/nih-dbus/Makefile.in
-}
-
-FILES_${PN}-dev += "${libdir}/pkgconfig/* \
- ${includedir}/* \
- ${libdir}/*.so \
- ${datadir}/* \
- "
-
-# target libnih requires native nih-dbus-tool
-BBCLASSEXTEND = "native"
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [meta-oe][PATCH] libnih: Remove
2020-01-09 20:33 [meta-oe][PATCH] libnih: Remove Adrian Bunk
@ 2020-01-09 21:49 ` Khem Raj
2020-01-09 21:51 ` akuster808
2020-01-15 10:15 ` Adrian Bunk
1 sibling, 1 reply; 5+ messages in thread
From: Khem Raj @ 2020-01-09 21:49 UTC (permalink / raw)
To: Adrian Bunk; +Cc: openembeded-devel
thanks Adrian, I wonder how many such recipes are we carrying it would
be helpful to retire them
On Thu, Jan 9, 2020 at 12:33 PM Adrian Bunk <bunk@stusta.de> wrote:
>
> The main user was upstart, which is no longer provided
> by any maintained layer.
>
> Signed-off-by: Adrian Bunk <bunk@stusta.de>
> ---
> .../packagegroups/packagegroup-meta-oe.bb | 2 +-
> ...files-also-make-it-work-with-latest-.patch | 24310 ----------------
> ...and-SIGCHILD-are-same-on-sytem-V-sys.patch | 28 -
> .../libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch | 3593 ---
> .../recipes-support/libnih/libnih_1.0.3.bb | 48 -
> 5 files changed, 1 insertion(+), 27980 deletions(-)
> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> delete mode 100644 meta-oe/recipes-support/libnih/libnih_1.0.3.bb
>
> diff --git a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> index 31c3f4e95..ad968ddf9 100644
> --- a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> +++ b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> @@ -236,7 +236,7 @@ RDEPENDS_packagegroup-meta-oe-support ="\
> libinih inotify-tools joe lcms lcov libatasmart libbytesize \
> libcereal libcyusbserial libee libeigen libestr libftdi libgit2 \
> libgpiod libiio libjs-jquery libjs-sizzle liblinebreak libmicrohttpd \
> - libmxml libnih liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
> + libmxml liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
> libssh libtar libteam libtinyxml2 libtinyxml libusbg libusb-compat libutempter \
> links lio-utils lockdev log4c log4cpp logwarn libdevmapper lvm2 \
> mailcap mbuffer mg minini \
> 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
> deleted file mode 100644
> index 2c857c26f..000000000
> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
> +++ /dev/null
> @@ -1,24310 +0,0 @@
> -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/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> deleted file mode 100644
> index a43b4b176..000000000
> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -From f1b9992caf9910f9f7afae401045e42572cc84ff Mon Sep 17 00:00:00 2001
> -From: Khem Raj <raj.khem@gmail.com>
> -Date: Sat, 1 Apr 2017 08:50:35 -0700
> -Subject: [PATCH] signal.c: SIGCLD and SIGCHILD are same on sytem V systems
> -
> -Musl drops the SIGCLD legacy
> -
> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> ----
> - nih/signal.c | 2 +-
> - 1 file changed, 1 insertion(+), 1 deletion(-)
> -
> -diff --git a/nih/signal.c b/nih/signal.c
> -index a241df9..691c8e6 100644
> ---- a/nih/signal.c
> -+++ b/nih/signal.c
> -@@ -87,7 +87,7 @@ static const SignalName signal_names[] = {
> - { SIGSTKFLT, "STKFLT" },
> - #endif
> - { SIGCHLD, "CHLD" },
> -- { SIGCLD, "CLD" },
> -+ { SIGCHLD, "CLD" },
> - { SIGCONT, "CONT" },
> - { SIGSTOP, "STOP" },
> - { SIGTSTP, "TSTP" },
> ---
> -2.12.1
> -
> diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> deleted file mode 100644
> index 5d125c851..000000000
> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> +++ /dev/null
> @@ -1,3593 +0,0 @@
> ---- libnih-1.0.3.orig/ChangeLog
> -+++ libnih-1.0.3/ChangeLog
> -@@ -1,3 +1,84 @@
> -+2013-03-13 Steve Langasek <steve.langasek@ubuntu.com>
> -+
> -+ * nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
> -+ passed to nih_dir_walk_scan() to ensure the nih_watch_new() filter
> -+ function is passed the NihWatch data rather than the data passed to
> -+ the nih_dir_walk() NihFileVisitor function (LP: #776532).
> -+
> -+ * nih/tests/test_watch.c (test_new): New test "with filter and data"
> -+ to ensure filter is passed correct value.
> -+
> -+2013-02-28 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * Removal of gcc 'malloc' function attribute resulting from
> -+ a clarification in its description which makes its use invalid.
> -+ (LP: #1123588).
> -+
> -+2013-02-05 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * nih/logging.c: nih_log_abort_message(): Remove erroneous check
> -+ left over from use of __abort_msg weak symbol.
> -+ * nih/tests/test_logging.c: Remove unecessary check on whether
> -+ __nih_abort_msg has an address.
> -+
> -+2012-12-13 Stéphane Graber <stgraber@ubuntu.com>
> -+
> -+ * nih-dbus-tool/type.c, nih-dbus-tool/marshal.c: Update dbus code
> -+ generator to allow for empty lists for type 'as'. This drops the
> -+ != NULL check for NULL terminated arrays and moves the iteration
> -+ loop inside an 'if' statement.
> -+
> -+2012-12-11 Dmitrijs Ledkovs <dmitrijs.ledkovs@canonical.com>
> -+
> -+ * nih/file.c (nih_dir_walk_scan): Fallback to lstat, if the
> -+ non-portable dirent.d_type is not available (LP: #672643) (Closes:
> -+ #695604).
> -+
> -+2012-12-10 Petr Lautrbach <plautrba@redhat.com>
> -+
> -+ * nih/tests/test_file.c: don't use dirent.d_type (not portable)
> -+
> -+2012-10-25 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the
> -+ (e)glibc private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> -+
> -+2011-08-31 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> -+ (test_unix_fd_to_str): Sanity check value before invoking strchr in
> -+ case it returns address of null (which would give a misleading test
> -+ pass).
> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> -+ (test_unix_fd_to_str, test_unix_fd_to_str_sync): Sanity check value
> -+ before invoking strchr in case it returns address of null (which would
> -+ give a misleading test pass).
> -+ * nih/config.c (): nih_config_block_end: Add check to ensure strchr()
> -+ doesn't return address of null since this would result in a misleading
> -+ return value of TRUE.
> -+
> -+ * nih/string.c (nih_str_split): Fixes to avoid over-running
> -+ input string and also returning an empty string array entry
> -+ when repeat is true (LP: #834813).
> -+ * nih/tests/test_string.c (test_str_split): Added a lot of new
> -+ tests for nih_str_split().
> -+
> -+2011-08-26 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * nih/io.c (nih_io_select_fds): Ensure number of fds being managed
> -+ is within limits.
> -+
> -+ * nih/config.c, nih/error.h, nih/io.c, nih/test_files.h: Correct
> -+ typos in comments.
> -+
> -+2011-06-20 James Hunt <james.hunt@ubuntu.com>
> -+
> -+ * nih/watch.c (nih_watch_handle): Handle non-directory watches;
> -+ previously a file watch resulted in an invalid file path ending in
> -+ a single slash (LP:#777097).
> -+ * nih/tests/test_watch.c: Added explicit test for watch on a file.
> -+
> - 2010-12-23 Scott James Remnant <scott@netsplit.com>
> -
> - * NEWS: Release 1.0.3
> ---- libnih-1.0.3.orig/nih/watch.c
> -+++ libnih-1.0.3/nih/watch.c
> -@@ -2,8 +2,8 @@
> - *
> - * watch.c - watching of files and directories with inotify
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -71,6 +71,9 @@
> - uint32_t events, uint32_t cookie,
> - const char *name,
> - int *caught_free);
> -+static int nih_watch_walk_filter (void *data, const char *path,
> -+ int is_dir)
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - /**
> -@@ -91,7 +94,7 @@
> - * sub-directories will be automatically watched.
> - *
> - * Additionally, the set of files and directories within @path can be
> -- * limited by passing a @filter function which will recieve the paths and
> -+ * limited by passing a @filter function which will receive the paths and
> - * may return TRUE to indicate that the path received should not be watched.
> - *
> - * When a file is created within @path, or moved from outside this location
> -@@ -104,7 +107,7 @@
> - * files that exist under @path when the watch is first added. This only
> - * occurs if the watch can be added.
> - *
> -- * This is a very high level wrapped around the inotify API; lower levels
> -+ * This is a very high level wrapper around the inotify API; lower levels
> - * can be obtained using the inotify API itself and some of the helper
> - * functions used by this one.
> - *
> -@@ -185,6 +188,35 @@
> - }
> -
> -
> -+ /**
> -+ * nih_watch_walk_filter:
> -+ * @data: NihWatch,
> -+ * @path: path to file,
> -+ * @is_dir: TRUE if @path is a directory.
> -+ *
> -+ * Callback function for nih_dir_walk(), used by nih_watch_add() to wrap
> -+ * the user-specified NihFileFilter (watch->filter) with a filter that can
> -+ * take watch itself as an argument.
> -+ *
> -+ * Returns: TRUE if the path should be ignored, FALSE otherwise.
> -+ **/
> -+static int
> -+nih_watch_walk_filter (void *data, const char *path, int is_dir)
> -+{
> -+ NihWatch *watch;
> -+
> -+ watch = (NihWatch *)data;
> -+
> -+ nih_assert (watch);
> -+
> -+ /* No filter, so accept all files */
> -+ if (! watch->filter)
> -+ return FALSE;
> -+
> -+ return watch->filter (watch->data, path, is_dir);
> -+}
> -+
> -+
> - /**
> - * nih_watch_handle_by_wd:
> - * @watch: watch to search,
> -@@ -295,7 +327,7 @@
> - * one; errors within the walk are warned automatically, so if this
> - * fails, it means we literally couldn't watch the top-level.
> - */
> -- if (subdirs && (nih_dir_walk (path, watch->filter,
> -+ if (subdirs && (nih_dir_walk (path, nih_watch_walk_filter,
> - (NihFileVisitor)nih_watch_add_visitor,
> - NULL, watch) < 0)) {
> - NihError *err;
> -@@ -494,12 +526,21 @@
> - return;
> - }
> -
> -+ /* Every other event must come with a name */
> -+ if (name && *name) {
> -
> -- /* Every other event must come with a name. */
> -- if ((! name) || strchr (name, '/'))
> -- return;
> -+ /* If name refers to a directory, there should be no associated
> -+ * path - just the name of the path element.
> -+ */
> -+ if (strchr (name, '/'))
> -+ return;
> -
> -- path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> -+ /* Event occured for file within a watched directory */
> -+ path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> -+ } else {
> -+ /* File event occured */
> -+ path = NIH_MUST (nih_strdup (NULL, handle->path));
> -+ }
> -
> - /* Check the filter */
> - if (watch->filter && watch->filter (watch->data, path,
> ---- libnih-1.0.3.orig/nih/hash.h
> -+++ libnih-1.0.3/nih/hash.h
> -@@ -141,7 +141,7 @@
> - * @hash: hash table to iterate,
> - * @iter: name of iterator variable.
> - *
> -- * Expans to nested for statements that iterate over each entry in each
> -+ * Expands to nested for statements that iterate over each entry in each
> - * bin of @hash, except for the bin head pointer, setting @iter to each
> - * entry for the block within the loop. A variable named _@iter_i is used
> - * to iterate the hash bins.
> -@@ -203,7 +203,7 @@
> - NihKeyFunction key_function,
> - NihHashFunction hash_function,
> - NihCmpFunction cmp_function)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihList * nih_hash_add (NihHash *hash, NihList *entry);
> - NihList * nih_hash_add_unique (NihHash *hash, NihList *entry);
> ---- libnih-1.0.3.orig/nih/main.h
> -+++ libnih-1.0.3/nih/main.h
> -@@ -138,7 +138,7 @@
> -
> - NihMainLoopFunc *nih_main_loop_add_func (const void *parent,
> - NihMainLoopCb callback, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void nih_main_term_signal (void *data, NihSignal *signal);
> -
> ---- libnih-1.0.3.orig/nih/command.h
> -+++ libnih-1.0.3/nih/command.h
> -@@ -123,7 +123,7 @@
> -
> - NihCommand *nih_command_join (const void *parent,
> - const NihCommand *a, const NihCommand *b)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih/config.h
> -+++ libnih-1.0.3/nih/config.h
> -@@ -140,10 +140,10 @@
> - char * nih_config_next_token (const void *parent, const char *file,
> - size_t len, size_t *pos, size_t *lineno,
> - const char *delim, int dequote)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * nih_config_next_arg (const void *parent, const char *file,
> - size_t len, size_t *pos, size_t *lineno)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - void nih_config_next_line (const char *file, size_t len,
> - size_t *pos, size_t *lineno);
> -
> -@@ -155,15 +155,15 @@
> -
> - char ** nih_config_parse_args (const void *parent, const char *file,
> - size_t len, size_t *pos, size_t *lineno)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * nih_config_parse_command (const void *parent, const char *file,
> - size_t len, size_t *pos, size_t *lineno)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * nih_config_parse_block (const void *parent, const char *file,
> - size_t len, size_t *pos, size_t *lineno,
> - const char *type)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - int nih_config_skip_block (const char *file, size_t len,
> - size_t *lineno, size_t *pos,
> - const char *type, size_t *endpos)
> ---- libnih-1.0.3.orig/nih/io.c
> -+++ libnih-1.0.3/nih/io.c
> -@@ -2,8 +2,8 @@
> - *
> - * io.c - file and socket input/output handling
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -165,6 +165,7 @@
> - nih_assert (readfds != NULL);
> - nih_assert (writefds != NULL);
> - nih_assert (exceptfds != NULL);
> -+ nih_assert (*nfds <= FD_SETSIZE);
> -
> - nih_io_init ();
> -
> -@@ -186,6 +187,9 @@
> - *nfds = nih_max (*nfds, watch->fd + 1);
> - }
> - }
> -+
> -+ /* Re-check in case we exceeded the limit in the loop */
> -+ nih_assert (*nfds <= FD_SETSIZE);
> - }
> -
> - /**
> -@@ -901,7 +905,7 @@
> - * read and placed into the receive buffer or queue, and the reader function
> - * is called if set.
> - *
> -- * Any data or messaages in the send buffer or queue are written out if the
> -+ * Any data or messages in the send buffer or queue are written out if the
> - * @events includes NIH_IO_WRITE.
> - *
> - * Errors are handled when data is read, and result in the error handled
> -@@ -1211,7 +1215,7 @@
> - * This function is called when the local end of a file descriptor being
> - * managed by NihIo should be closed. Usually this is because the remote
> - * end has been closed (without error) but it can also be because no
> -- * error handler was given
> -+ * error handler was given.
> - *
> - * Normally this just calls the close handler, or if not available, it
> - * closes the file descriptor and frees the structure (which may be
> -@@ -1291,7 +1295,7 @@
> - * @io: structure to be destroyed.
> - *
> - * Closes the file descriptor associated with an NihIo structure so that
> -- * the structure can be freed. IF an error is caught by closing the
> -+ * the structure can be freed. If an error is caught by closing the
> - * descriptor, the error handler is called instead of the error being raised;
> - * this allows you to group your error handling in one place rather than
> - * special-case close.
> ---- libnih-1.0.3.orig/nih/watch.h
> -+++ libnih-1.0.3/nih/watch.h
> -@@ -156,7 +156,7 @@
> - NihCreateHandler create_handler,
> - NihModifyHandler modify_handler,
> - NihDeleteHandler delete_handler, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_watch_add (NihWatch *watch, const char *path, int subdirs)
> - __attribute__ ((warn_unused_result));
> ---- libnih-1.0.3.orig/nih/tree.h
> -+++ libnih-1.0.3/nih/tree.h
> -@@ -344,9 +344,9 @@
> -
> - void nih_tree_init (NihTree *tree);
> - NihTree * nih_tree_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - NihTreeEntry *nih_tree_entry_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihTree * nih_tree_add (NihTree *tree, NihTree *node,
> - NihTreeWhere where);
> ---- libnih-1.0.3.orig/nih/file.c
> -+++ libnih-1.0.3/nih/file.c
> -@@ -65,7 +65,7 @@
> - /* Prototypes for static functions */
> - static char **nih_dir_walk_scan (const char *path, NihFileFilter filter,
> - void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static int nih_dir_walk_visit (const char *dirname, NihList *dirs,
> - const char *path, NihFileFilter filter,
> - NihFileVisitor visitor,
> -@@ -619,6 +619,8 @@
> - struct dirent *ent;
> - char **paths;
> - size_t npaths;
> -+ int isdir;
> -+ struct stat statbuf;
> -
> - nih_assert (path != NULL);
> -
> -@@ -640,7 +642,15 @@
> - subpath = NIH_MUST (nih_sprintf (NULL, "%s/%s",
> - path, ent->d_name));
> -
> -- if (filter && filter (data, subpath, ent->d_type == DT_DIR))
> -+ if (ent->d_type == DT_UNKNOWN) {
> -+ if ( lstat (subpath, &statbuf))
> -+ isdir = 0;
> -+ else
> -+ isdir = S_ISDIR(statbuf.st_mode);
> -+ } else
> -+ isdir = ent->d_type == DT_DIR;
> -+
> -+ if (filter && filter (data, subpath, isdir))
> - continue;
> -
> - NIH_MUST (nih_str_array_addp (&paths, NULL, &npaths, subpath));
> ---- libnih-1.0.3.orig/nih/alloc.c
> -+++ libnih-1.0.3/nih/alloc.c
> -@@ -119,8 +119,7 @@
> - static inline int nih_alloc_context_free (NihAllocCtx *ctx);
> -
> - static inline NihAllocRef *nih_alloc_ref_new (NihAllocCtx *parent,
> -- NihAllocCtx *child)
> -- __attribute__ ((malloc));
> -+ NihAllocCtx *child);
> - static inline void nih_alloc_ref_free (NihAllocRef *ref);
> - static inline NihAllocRef *nih_alloc_ref_lookup (NihAllocCtx *parent,
> - NihAllocCtx *child);
> ---- libnih-1.0.3.orig/nih/timer.h
> -+++ libnih-1.0.3/nih/timer.h
> -@@ -59,7 +59,7 @@
> - * @months: months (1-12),
> - * @wdays: days of week (0-7).
> - *
> -- * Indidcates when scheduled timers should be run, each member is a bit
> -+ * Indicates when scheduled timers should be run, each member is a bit
> - * field where the bit is 1 if the timer should be run for that value and
> - * 0 if not.
> - **/
> -@@ -117,14 +117,14 @@
> -
> - NihTimer *nih_timer_add_timeout (const void *parent, time_t timeout,
> - NihTimerCb callback, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - NihTimer *nih_timer_add_periodic (const void *parent, time_t period,
> - NihTimerCb callback, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - NihTimer *nih_timer_add_scheduled (const void *parent,
> - NihTimerSchedule *schedule,
> - NihTimerCb callback, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihTimer *nih_timer_next_due (void);
> - void nih_timer_poll (void);
> ---- libnih-1.0.3.orig/nih/config.c
> -+++ libnih-1.0.3/nih/config.c
> -@@ -2,8 +2,8 @@
> - *
> - * config.c - configuration file parsing
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -657,7 +657,7 @@
> - * of the returned string are freed, the returned string will also be
> - * freed.
> - *
> -- * Returns: the command found or NULL on raised error.
> -+ * Returns: the newly allocated command found or NULL on raised error.
> - **/
> - char *
> - nih_config_parse_command (const void *parent,
> -@@ -714,7 +714,7 @@
> - * @lineno: line number,
> - * @type: block identifier.
> - *
> -- * Extracts a block of text from @line, stopping when the pharse "end @type"
> -+ * Extracts a block of text from @line, stopping when the phrase "end @type"
> - * is encountered without any quotes or blackslash escaping within it.
> - *
> - * @file may be a memory mapped file, in which case @pos should be given
> -@@ -950,7 +950,7 @@
> - return FALSE;
> -
> - /* Must be whitespace after */
> -- if (! strchr (NIH_CONFIG_WS, file[p + 3]))
> -+ if (file[p + 3] && ! strchr (NIH_CONFIG_WS, file[p + 3]))
> - return FALSE;
> -
> - /* Find the second word */
> ---- libnih-1.0.3.orig/nih/option.h
> -+++ libnih-1.0.3/nih/option.h
> -@@ -124,11 +124,11 @@
> - char ** nih_option_parser (const void *parent,
> - int argc, char *argv[],
> - NihOption *options, int break_nonopt)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihOption *nih_option_join (const void *parent,
> - const NihOption *a, const NihOption *b)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_option_count (NihOption *option, const char *arg);
> - int nih_option_int (NihOption *option, const char *arg);
> ---- libnih-1.0.3.orig/nih/signal.h
> -+++ libnih-1.0.3/nih/signal.h
> -@@ -76,7 +76,7 @@
> -
> - NihSignal * nih_signal_add_handler (const void *parent, int signum,
> - NihSignalHandler handler, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void nih_signal_handler (int signum);
> - void nih_signal_poll (void);
> ---- libnih-1.0.3.orig/nih/list.h
> -+++ libnih-1.0.3/nih/list.h
> -@@ -37,7 +37,7 @@
> - * after a known entry, and remove an entry from the list.
> - *
> - * List entries may be created in one of two ways. The most common is to
> -- * embed the NihList structure as the frist member of your own structure,
> -+ * embed the NihList structure as the first member of your own structure,
> - * and initialise it with nih_list_init() after allocating the structure.
> - * Alternatively you may create NihListEntry structures with
> - * nih_list_entry_new() and point at your own data from them.
> -@@ -196,10 +196,10 @@
> -
> - void nih_list_init (NihList *entry);
> - NihList * nih_list_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihListEntry *nih_list_entry_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - NihList * nih_list_add (NihList *list, NihList *entry);
> ---- libnih-1.0.3.orig/nih/logging.c
> -+++ libnih-1.0.3/nih/logging.c
> -@@ -39,11 +39,11 @@
> -
> -
> - /**
> -- * __abort_msg:
> -+ * __nih_abort_msg:
> - *
> -- * A glibc variable that keeps the assertion message in the core dump.
> -+ * A variable that keeps the assertion message in the core dump.
> - **/
> --extern char *__abort_msg __attribute__ ((weak));
> -+char *__nih_abort_msg = NULL;
> -
> - /**
> - * logger:
> -@@ -114,19 +114,16 @@
> - * nih_log_abort_message:
> - * @message: message to be logged.
> - *
> -- * Save @message in the glibc __abort_msg variable so it can be retrieved
> -+ * Save @message in the __nih_abort_msg variable so it can be retrieved
> - * by debuggers if we should crash at this point.
> - **/
> - static void
> - nih_log_abort_message (const char *message)
> - {
> -- if (! &__abort_msg)
> -- return;
> -+ if (__nih_abort_msg)
> -+ nih_discard (__nih_abort_msg);
> -
> -- if (__abort_msg)
> -- nih_discard (__abort_msg);
> --
> -- __abort_msg = NIH_MUST (nih_strdup (NULL, message));
> -+ __nih_abort_msg = NIH_MUST (nih_strdup (NULL, message));
> - }
> -
> - /**
> ---- libnih-1.0.3.orig/nih/test_files.h
> -+++ libnih-1.0.3/nih/test_files.h
> -@@ -1,7 +1,7 @@
> - /* libnih
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -39,7 +39,7 @@
> - * TEST_FILENAME:
> - * @_var: variable to store filename in.
> - *
> -- * Generate a filename that may be used for testing, it's unlinked it if
> -+ * Generate a filename that may be used for testing, it's unlinked if it
> - * exists and it's up to you to unlink it when done. @_var should be at
> - * least PATH_MAX long.
> - **/
> ---- libnih-1.0.3.orig/nih/test_process.h
> -+++ libnih-1.0.3/nih/test_process.h
> -@@ -36,7 +36,7 @@
> - * Spawn a child in which a test can be performed without affecting the
> - * main flow of the process. The pid of the child is stored in @_pid.
> - *
> -- * This macro ensures that the child has begun exectution before the
> -+ * This macro ensures that the child has begun execution before the
> - * parent is allowed to continue through the usual use of a pipe.
> - *
> - * A block of code should follow this macro, which is the code that will
> ---- libnih-1.0.3.orig/nih/child.h
> -+++ libnih-1.0.3/nih/child.h
> -@@ -98,7 +98,7 @@
> - NihChildWatch *nih_child_add_watch (const void *parent, pid_t pid,
> - NihChildEvents events,
> - NihChildHandler handler, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void nih_child_poll (void);
> -
> ---- libnih-1.0.3.orig/nih/alloc.h
> -+++ libnih-1.0.3/nih/alloc.h
> -@@ -299,7 +299,7 @@
> - * It is permissible to take references to foo within its scope, or by
> - * functions called, in which case it will not be freed. Also it is
> - * generally nonsensical to allocate with a parent, since this too will
> -- * prevent it from beign freed.
> -+ * prevent it from being freed.
> - **/
> - #define nih_local __attribute__ ((cleanup(_nih_discard_local)))
> -
> -@@ -307,11 +307,11 @@
> - NIH_BEGIN_EXTERN
> -
> - void * nih_alloc (const void *parent, size_t size)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void * nih_realloc (void *ptr, const void *parent,
> - size_t size)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_free (void *ptr);
> - int nih_discard (void *ptr);
> ---- libnih-1.0.3.orig/nih/io.h
> -+++ libnih-1.0.3/nih/io.h
> -@@ -269,7 +269,7 @@
> - NihIoWatch * nih_io_add_watch (const void *parent, int fd,
> - NihIoEvents events,
> - NihIoWatcher watcher, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void nih_io_select_fds (int *nfds, fd_set *readfds,
> - fd_set *writefds, fd_set *exceptfds);
> -@@ -278,12 +278,12 @@
> -
> -
> - NihIoBuffer * nih_io_buffer_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_io_buffer_resize (NihIoBuffer *buffer, size_t grow);
> - char * nih_io_buffer_pop (const void *parent,
> - NihIoBuffer *buffer, size_t *len)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - void nih_io_buffer_shrink (NihIoBuffer *buffer, size_t len);
> - int nih_io_buffer_push (NihIoBuffer *buffer,
> - const char *str, size_t len)
> -@@ -291,7 +291,7 @@
> -
> -
> - NihIoMessage *nih_io_message_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_io_message_add_control (NihIoMessage *message, int level,
> - int type, socklen_t len,
> -@@ -300,7 +300,7 @@
> -
> - NihIoMessage *nih_io_message_recv (const void *parent, int fd,
> - size_t *len)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - ssize_t nih_io_message_send (NihIoMessage *message, int fd)
> - __attribute__ ((warn_unused_result));
> -
> -@@ -310,7 +310,7 @@
> - NihIoCloseHandler close_handler,
> - NihIoErrorHandler error_handler,
> - void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - void nih_io_shutdown (NihIo *io);
> - int nih_io_destroy (NihIo *io);
> -
> -@@ -319,14 +319,14 @@
> -
> - char * nih_io_read (const void *parent, NihIo *io,
> - size_t *len)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - int nih_io_write (NihIo *io, const char *str,
> - size_t len)
> - __attribute__ ((warn_unused_result));
> -
> - char * nih_io_get (const void *parent, NihIo *io,
> - const char *delim)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int nih_io_printf (NihIo *io, const char *format, ...)
> - __attribute__ ((warn_unused_result, format (printf, 2, 3)));
> ---- libnih-1.0.3.orig/nih/test_output.h
> -+++ libnih-1.0.3/nih/test_output.h
> -@@ -61,10 +61,10 @@
> -
> - /**
> - * TEST_FEATURE:
> -- * @_feat: name of function feature being tested.
> -+ * @_feat: name of function or group feature being tested.
> - *
> -- * Output a message indicating that a sub-test of a function is being
> -- * performed, specifically the feature named _feat.
> -+ * Output a message indicating that a sub-test of a function or
> -+ * group is being performed, specifically the feature named _feat.
> - **/
> - #define TEST_FEATURE(_feat) \
> - printf ("...%s\n", _feat);
> ---- libnih-1.0.3.orig/nih/error.h
> -+++ libnih-1.0.3/nih/error.h
> -@@ -1,7 +1,7 @@
> - /* libnih
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -111,7 +111,7 @@
> - * @message: human-readable message.
> - *
> - * Raises an error with the given details in the current error context,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - *
> - * @message should be a static string, as it will not be freed when the
> -@@ -126,7 +126,7 @@
> - * @format: format string for human-readable message.
> - *
> - * Raises an error with the given details in the current error context,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - *
> - * The human-readable message for the error is parsed according to @format,
> -@@ -140,7 +140,7 @@
> - * nih_error_raise_system:
> - *
> - * Raises an error with details taken from the current value of errno,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - **/
> - #define nih_error_raise_system() \
> -@@ -162,7 +162,7 @@
> - * @error: existing object to raise.
> - *
> - * Raises the existing error object in the current error context,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - *
> - * This is normally used to raise a taken error that has not been handled,
> -@@ -182,7 +182,7 @@
> - * @message: human-readable message.
> - *
> - * Raises an error with the given details in the current error context,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - *
> - * Will return from the current function with @retval, which may be left
> -@@ -199,7 +199,7 @@
> - * @retval: return value for function.
> - *
> - * Raises an error with details taken from the current value of errno,
> -- * if an unhandled error already exists then an error message is emmitted
> -+ * if an unhandled error already exists then an error message is emitted
> - * through the logging system; you should try to avoid this.
> - *
> - * Will return from the current function with @retval, which may be left
> ---- libnih-1.0.3.orig/nih/string.h
> -+++ libnih-1.0.3/nih/string.h
> -@@ -35,60 +35,60 @@
> - NIH_BEGIN_EXTERN
> -
> - char * nih_sprintf (const void *parent, const char *format, ...)
> -- __attribute__ ((format (printf, 2, 3), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 2, 3), warn_unused_result));
> -
> - char * nih_vsprintf (const void *parent, const char *format,
> - va_list args)
> -- __attribute__ ((format (printf, 2, 0), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 2, 0), warn_unused_result));
> -
> - char * nih_strdup (const void *parent, const char *str)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * nih_strndup (const void *parent, const char *str, size_t len)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * nih_strcat (char **str, const void *parent, const char *src)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * nih_strncat (char **str, const void *parent, const char *src,
> - size_t len)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * nih_strcat_sprintf (char **str, const void *parent,
> - const char *format, ...)
> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> - char * nih_strcat_vsprintf (char **str, const void *parent,
> - const char *format, va_list args)
> -- __attribute__ ((format (printf, 3, 0), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 3, 0), warn_unused_result));
> -
> - char **nih_str_split (const void *parent, const char *str,
> - const char *delim, int repeat)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char **nih_str_array_new (const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char **nih_str_array_add (char ***array, const void *parent, size_t *len,
> - const char *str)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char **nih_str_array_addn (char ***array, const void *parent, size_t *len,
> - const char *str, size_t strlen)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char **nih_str_array_addp (char ***array, const void *parent, size_t *len,
> - void *ptr)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char **nih_str_array_copy (const void *parent, size_t *len,
> - char * const *array)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char **nih_str_array_append (char ***array, const void *parent, size_t *len,
> - char * const *args)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * nih_str_wrap (const void *parent, const char *str, size_t len,
> - size_t first_indent, size_t indent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - size_t nih_str_screen_width (void);
> - char * nih_str_screen_wrap (const void *parent, const char *str,
> - size_t first_indent, size_t indent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih/string.c
> -+++ libnih-1.0.3/nih/string.c
> -@@ -405,7 +405,7 @@
> - const char *ptr;
> -
> - /* Skip initial delimiters */
> -- while (repeat && strchr (delim, *str))
> -+ while (repeat && *str && strchr (delim, *str))
> - str++;
> -
> - /* Find the end of the token */
> -@@ -413,6 +413,13 @@
> - while (*str && (! strchr (delim, *str)))
> - str++;
> -
> -+ /* Don't create an empty string array element in repeat
> -+ * mode if there is no token (as a result of a
> -+ * duplicated delimiter character).
> -+ */
> -+ if (repeat && (str == ptr))
> -+ continue;
> -+
> - if (! nih_str_array_addn (&array, parent, &len,
> - ptr, str - ptr)) {
> - nih_free (array);
> ---- libnih-1.0.3.orig/nih/file.h
> -+++ libnih-1.0.3/nih/file.h
> -@@ -82,7 +82,7 @@
> -
> - char *nih_file_read (const void *parent, const char *path,
> - size_t *length)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void *nih_file_map (const char *path, int flags, size_t *length)
> - __attribute__ ((warn_unused_result));
> ---- libnih-1.0.3.orig/nih/tests/test_option.c
> -+++ libnih-1.0.3/nih/tests/test_option.c
> -@@ -1574,7 +1574,7 @@
> - output = tmpfile ();
> - TEST_CHILD (pid) {
> - TEST_DIVERT_STDOUT (output) {
> -- char **args;
> -+ char **args __attribute__((unused));
> -
> - args = nih_option_parser (NULL, argc, argv,
> - options, FALSE);
> -@@ -1652,7 +1652,7 @@
> - unsetenv ("COLUMNS");
> -
> - TEST_DIVERT_STDOUT (output) {
> -- char **args;
> -+ char **args __attribute__((unused));
> -
> - args = nih_option_parser (NULL, argc, argv,
> - options, FALSE);
> ---- libnih-1.0.3.orig/nih/tests/test_logging.c
> -+++ libnih-1.0.3/nih/tests/test_logging.c
> -@@ -31,7 +31,7 @@
> - #include <nih/main.h>
> -
> -
> --extern char *__abort_msg __attribute__ ((weak));
> -+extern char *__nih_abort_msg;
> -
> - static NihLogLevel last_priority = NIH_LOG_UNKNOWN;
> - static char * last_message = NULL;
> -@@ -156,68 +156,63 @@
> - }
> -
> -
> -- /* Check that a fatal message is also stored in the glibc __abort_msg
> -+ /* Check that a fatal message is also stored in the __nih_abort_msg
> - * variable.
> - */
> -- if (&__abort_msg) {
> -- TEST_FEATURE ("with fatal message");
> -- TEST_ALLOC_FAIL {
> -- __abort_msg = NULL;
> -- last_priority = NIH_LOG_UNKNOWN;
> -- last_message = NULL;
> --
> -- ret = nih_log_message (NIH_LOG_FATAL,
> -- "message with %s %d formatting",
> -- "some", 20);
> --
> -- TEST_EQ (ret, 0);
> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
> --
> -- TEST_NE_P (__abort_msg, NULL);
> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> -+ TEST_FEATURE ("with fatal message");
> -+ TEST_ALLOC_FAIL {
> -+ __nih_abort_msg = NULL;
> -+ last_priority = NIH_LOG_UNKNOWN;
> -+ last_message = NULL;
> -
> -- free (last_message);
> -- }
> -+ ret = nih_log_message (NIH_LOG_FATAL,
> -+ "message with %s %d formatting",
> -+ "some", 20);
> -
> -+ TEST_EQ (ret, 0);
> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
> -
> -- /* Check that a fatal message can safely overwrite one already stored
> -- * in the glibc __abort_msg variable.
> -- */
> -- TEST_FEATURE ("with second fatal message");
> -- TEST_ALLOC_FAIL {
> -- TEST_ALLOC_SAFE {
> -- msg = nih_strdup (NULL, "test");
> -- }
> --
> -- __abort_msg = msg;
> -- TEST_FREE_TAG (msg);
> --
> -- last_priority = NIH_LOG_UNKNOWN;
> -- last_message = NULL;
> --
> -- ret = nih_log_message (NIH_LOG_FATAL,
> -- "message with %s %d formatting",
> -- "some", 20);
> --
> -- TEST_EQ (ret, 0);
> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
> --
> -- TEST_FREE (msg);
> --
> -- TEST_NE_P (__abort_msg, NULL);
> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> -+ TEST_NE_P (__nih_abort_msg, NULL);
> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> -
> -- free (last_message);
> -- }
> -- } else {
> -- printf ("SKIP: __abort_msg not available\n");
> -+ free (last_message);
> - }
> -
> -
> -+ /* Check that a fatal message can safely overwrite one already stored
> -+ * in the __nih_abort_msg variable.
> -+ */
> -+ TEST_FEATURE ("with second fatal message");
> -+ TEST_ALLOC_FAIL {
> -+ TEST_ALLOC_SAFE {
> -+ msg = nih_strdup (NULL, "test");
> -+ }
> -+
> -+ __nih_abort_msg = msg;
> -+ TEST_FREE_TAG (msg);
> -+
> -+ last_priority = NIH_LOG_UNKNOWN;
> -+ last_message = NULL;
> -+
> -+ ret = nih_log_message (NIH_LOG_FATAL,
> -+ "message with %s %d formatting",
> -+ "some", 20);
> -+
> -+ TEST_EQ (ret, 0);
> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
> -+
> -+ TEST_FREE (msg);
> -+
> -+ TEST_NE_P (__nih_abort_msg, NULL);
> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> -+
> -+ free (last_message);
> -+ }
> -+
> - /* Check that the nih_debug macro wraps the call properly and
> - * includes the function in which the message occurred.
> - */
> ---- libnih-1.0.3.orig/nih/tests/test_hash.c
> -+++ libnih-1.0.3/nih/tests/test_hash.c
> -@@ -470,7 +470,8 @@
> - test_lookup (void)
> - {
> - NihHash *hash;
> -- NihList *entry1, *entry2, *entry3, *ptr;
> -+ NihList *entry1, *entry2, *ptr;
> -+ NihList *entry3 __attribute__((unused));
> -
> - TEST_FUNCTION ("nih_hash_lookup");
> - hash = nih_hash_string_new (NULL, 0);
> ---- libnih-1.0.3.orig/nih/tests/test_main.c
> -+++ libnih-1.0.3/nih/tests/test_main.c
> -@@ -457,7 +457,7 @@
> - test_main_loop (void)
> - {
> - NihMainLoopFunc *func;
> -- NihTimer *timer;
> -+ NihTimer *timer __attribute__((unused));
> - int ret;
> -
> - /* Check that we can run through the main loop, and that the
> ---- libnih-1.0.3.orig/nih/tests/test_watch.c
> -+++ libnih-1.0.3/nih/tests/test_watch.c
> -@@ -2,8 +2,8 @@
> - *
> - * test_watch.c - test suite for nih/watch.c
> - *
> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> -- * Copyright © 2009 Canonical Ltd.
> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> -+ * Copyright © 2011 Canonical Ltd.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2, as
> -@@ -39,6 +39,8 @@
> - #include <nih/error.h>
> - #include <nih/logging.h>
> -
> -+/* Read "The Hitchhikers Guide to the Galaxy" */
> -+#define FILTER_VALUE 42
> -
> - static int
> - my_filter (void *data,
> -@@ -54,6 +56,26 @@
> - return FALSE;
> - }
> -
> -+/* Set by my_filter2 () so it knows if it has already been called */
> -+static int my_filter2_called = 0;
> -+
> -+static int
> -+my_filter2 (int *value,
> -+ const char *path,
> -+ int is_dir)
> -+{
> -+ /* we only want to toggle the value once */
> -+ if (my_filter2_called)
> -+ return TRUE;
> -+
> -+ my_filter2_called = 1;
> -+
> -+ nih_assert (value && *value == FILTER_VALUE);
> -+ *value = 0;
> -+
> -+ return FALSE;
> -+}
> -+
> - static int create_called = 0;
> - static int modify_called = 0;
> - static int delete_called = 0;
> -@@ -553,6 +575,44 @@
> - nih_free (watch);
> - }
> -
> -+ /* Ensure the file filter gets passed the correct data pointer.
> -+ */
> -+ TEST_FEATURE ("with filter and data");
> -+
> -+ /* Ensure we have a new directory */
> -+ TEST_FILENAME (dirname);
> -+ mkdir (dirname, 0755);
> -+
> -+ /* Create a single file */
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/foo");
> -+
> -+ fd = fopen (filename, "w");
> -+ fprintf (fd, "test\n");
> -+ fclose (fd);
> -+
> -+ TEST_ALLOC_FAIL {
> -+ int watch_data = FILTER_VALUE;
> -+
> -+ /* Reset required to appease TEST_ALLOC_FAIL */
> -+ my_filter2_called = 0;
> -+
> -+ watch = nih_watch_new (NULL, dirname,
> -+ TRUE, TRUE,
> -+ (NihFileFilter)my_filter2,
> -+ NULL, NULL, NULL,
> -+ &watch_data);
> -+
> -+ TEST_NE_P (watch, NULL);
> -+
> -+ /* Ensure the filter was called and changed the value */
> -+
> -+ TEST_NE (my_filter2_called, 0);
> -+ TEST_EQ (watch_data, 0);
> -+
> -+ nih_free (watch);
> -+ }
> -+
> - strcpy (filename, dirname);
> - strcat (filename, "/bar");
> - chmod (filename, 0755);
> -@@ -946,13 +1006,82 @@
> - nih_error_init ();
> -
> - TEST_FILENAME (dirname);
> -- mkdir (dirname, 0755);
> -+ TEST_EQ (mkdir (dirname, 0755), 0);
> -
> -- watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> -- my_create_handler, my_modify_handler,
> -+ TEST_FEATURE ("with watched file");
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/foo");
> -+
> -+ /* Create file first since we don't set a create handler on the
> -+ * watch.
> -+ */
> -+ fd = fopen (filename, "w");
> -+ fprintf (fd, "bar\n");
> -+ fclose (fd);
> -+
> -+ create_called = 0;
> -+ modify_called = 0;
> -+ delete_called = 0;
> -+ logger_called = 0;
> -+ last_path = NULL;
> -+ last_watch = NULL;
> -+ last_data = NULL;
> -+
> -+ watch = nih_watch_new (NULL, filename, FALSE, FALSE, NULL,
> -+ NULL, my_modify_handler,
> - my_delete_handler, &watch);
> -+ TEST_NE_P (watch, NULL);
> -+
> -+ /* Now, modify the existing file to trigger the modify handler. */
> -+ fd = fopen (filename, "a+");
> -+ fprintf (fd, "baz\n");
> -+ fclose (fd);
> -+
> -+ nfds = 0;
> -+ FD_ZERO (&readfds);
> -+ FD_ZERO (&writefds);
> -+ FD_ZERO (&exceptfds);
> -+
> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> -+
> -+ TEST_EQ_STR (watch->path, filename);
> -+
> -+ /* Ensure no regression to old behaviour (LP:#777097) */
> -+ TEST_NE (last_path[ strlen(last_path) - 1 ], '/');
> -+
> -+ TEST_EQ_STR (last_path, filename);
> -+ TEST_EQ (modify_called, 1);
> -+
> -+ unlink (filename);
> -+
> -+ nfds = 0;
> -+ FD_ZERO (&readfds);
> -+ FD_ZERO (&writefds);
> -+ FD_ZERO (&exceptfds);
> -+
> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> -
> -+ TEST_EQ (delete_called, 1);
> -
> -+ rmdir (filename);
> -+ nih_free (last_path);
> -+
> -+ create_called = 0;
> -+ modify_called = 0;
> -+ delete_called = 0;
> -+ logger_called = 0;
> -+ last_path = NULL;
> -+ last_watch = NULL;
> -+ last_data = NULL;
> -+
> -+
> -+ watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> -+ my_create_handler, my_modify_handler,
> -+ my_delete_handler, &watch);
> - /* Check that creating a file within the directory being watched
> - * results in the create handler being called, and passed the full
> - * path of the created file to it.
> ---- libnih-1.0.3.orig/nih/tests/test_string.c
> -+++ libnih-1.0.3/nih/tests/test_string.c
> -@@ -619,6 +619,215 @@
> - nih_free (array);
> - }
> -
> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> -+ "characters at string start");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "\t\tthis is a test", " \t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> -+ for (i = 0; i < 6; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "");
> -+ TEST_EQ_STR (array[1], "");
> -+ TEST_EQ_STR (array[2], "this");
> -+ TEST_EQ_STR (array[3], "is");
> -+ TEST_EQ_STR (array[4], "a");
> -+ TEST_EQ_STR (array[5], "test");
> -+ TEST_EQ_P (array[6], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> -+ "characters at string start");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, " \tthis is a test", " \t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> -+ for (i = 0; i < 6; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "");
> -+ TEST_EQ_STR (array[1], "");
> -+ TEST_EQ_STR (array[2], "this");
> -+ TEST_EQ_STR (array[3], "is");
> -+ TEST_EQ_STR (array[4], "a");
> -+ TEST_EQ_STR (array[5], "test");
> -+ TEST_EQ_P (array[6], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> -+ "characters within string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "this is a\t\ttest", " \t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 8);
> -+ for (i = 0; i < 7; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "this");
> -+ TEST_EQ_STR (array[1], "is");
> -+ TEST_EQ_STR (array[2], "");
> -+ TEST_EQ_STR (array[3], "");
> -+ TEST_EQ_STR (array[4], "a");
> -+ TEST_EQ_STR (array[5], "");
> -+ TEST_EQ_STR (array[6], "test");
> -+ TEST_EQ_P (array[7], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> -+ "characters within string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "this is \n\ta\ttest", " \t\n", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> -+ for (i = 0; i < 6; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "this");
> -+ TEST_EQ_STR (array[1], "is");
> -+ TEST_EQ_STR (array[2], "");
> -+ TEST_EQ_STR (array[3], "");
> -+ TEST_EQ_STR (array[4], "a");
> -+ TEST_EQ_STR (array[5], "test");
> -+ TEST_EQ_P (array[6], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> -+ "characters at string end");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "this is a test ", " \t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> -+ for (i = 0; i < 5; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "this");
> -+ TEST_EQ_STR (array[1], "is");
> -+ TEST_EQ_STR (array[2], "a");
> -+ TEST_EQ_STR (array[3], "test");
> -+ TEST_EQ_STR (array[4], "");
> -+ TEST_EQ_P (array[5], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> -+ "characters at string end");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "this is a test \t", " \t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> -+ for (i = 0; i < 5; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "this");
> -+ TEST_EQ_STR (array[1], "is");
> -+ TEST_EQ_STR (array[2], "a");
> -+ TEST_EQ_STR (array[3], "test");
> -+ TEST_EQ_STR (array[4], "");
> -+ TEST_EQ_P (array[5], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> -+ "characters at beginning, middle and end of string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, " this is\n\n\na test\t\t\t", " \t\n", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 12);
> -+ for (i = 0; i < 11; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "");
> -+ TEST_EQ_STR (array[1], "");
> -+ TEST_EQ_STR (array[2], "");
> -+ TEST_EQ_STR (array[3], "this");
> -+ TEST_EQ_STR (array[4], "is");
> -+ TEST_EQ_STR (array[5], "");
> -+ TEST_EQ_STR (array[6], "");
> -+ TEST_EQ_STR (array[7], "a");
> -+ TEST_EQ_STR (array[8], "test");
> -+ TEST_EQ_STR (array[9], "");
> -+ TEST_EQ_STR (array[10], "");
> -+ TEST_EQ_P (array[11], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> -+ "characters at beginning, middle and end of string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, ": \nthis is\t \n:a test:\n ", "\n :\t", FALSE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 13);
> -+ for (i = 0; i < 12; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "");
> -+ TEST_EQ_STR (array[1], "");
> -+ TEST_EQ_STR (array[2], "");
> -+ TEST_EQ_STR (array[3], "this");
> -+ TEST_EQ_STR (array[4], "is");
> -+ TEST_EQ_STR (array[5], "");
> -+ TEST_EQ_STR (array[6], "");
> -+ TEST_EQ_STR (array[7], "");
> -+ TEST_EQ_STR (array[8], "a");
> -+ TEST_EQ_STR (array[9], "test");
> -+ TEST_EQ_STR (array[10], "");
> -+ TEST_EQ_STR (array[11], "");
> -+ TEST_EQ_P (array[12], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -
> - /* Check that we can split a string treating multiple consecutive
> - * matching characters as a single separator to be skipped.
> -@@ -645,6 +854,177 @@
> - nih_free (array);
> - }
> -
> -+ /* Check that we can split a string containing multiple
> -+ * occurences of one of the delimiter characters at the
> -+ * beginning of the string.
> -+ */
> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter characters at string start");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "\n\nhello", " \t\r\n", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> -+ for (i = 0; i < 1; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_P (array[1], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter characters at string start");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "\n\r hello", " \t\r\n", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> -+ for (i = 0; i < 1; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_P (array[1], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> -+ "characters within string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "hello\n\rworld", " \t\n\r", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> -+ for (i = 0; i < 2; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_STR (array[1], "world");
> -+ TEST_EQ_P (array[2], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> -+ "characters within string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "hello\n\r\tworld", " \t\n\r", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> -+ for (i = 0; i < 2; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_STR (array[1], "world");
> -+ TEST_EQ_P (array[2], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> -+ "characters at string end");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "hello\n\n\n\n\n\n\n", " \t\r\n", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> -+ for (i = 0; i < 1; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_P (array[1], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> -+ "characters at string end");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL, "hello \r\t\r\t\n ", " \t\r\n", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> -+ for (i = 0; i < 1; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_P (array[1], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> -+ "characters at beginning, middle and end of string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL,
> -+ " hello\n\n\n, world\n\n\n",
> -+ "\r\t\n ", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> -+ for (i = 0; i < 3; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_STR (array[1], ",");
> -+ TEST_EQ_STR (array[2], "world");
> -+ TEST_EQ_P (array[3], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -+
> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> -+ "characters at beginning, middle and end of string");
> -+ TEST_ALLOC_FAIL {
> -+ array = nih_str_split (NULL,
> -+ "\n \r\thello\n\n\r , \n\t\rworld\t \r\n \n",
> -+ " \t\n\r", TRUE);
> -+
> -+ if (test_alloc_failed) {
> -+ TEST_EQ_P (array, NULL);
> -+ continue;
> -+ }
> -+
> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> -+ for (i = 0; i < 3; i++)
> -+ TEST_ALLOC_PARENT (array[i], array);
> -+
> -+ TEST_EQ_STR (array[0], "hello");
> -+ TEST_EQ_STR (array[1], ",");
> -+ TEST_EQ_STR (array[2], "world");
> -+ TEST_EQ_P (array[3], NULL);
> -+
> -+ nih_free (array);
> -+ }
> -
> - /* Check that we can give an empty string, and end up with a
> - * one-element array that only contains a NULL pointer.
> ---- libnih-1.0.3.orig/nih/tests/test_file.c
> -+++ libnih-1.0.3/nih/tests/test_file.c
> -@@ -724,6 +724,25 @@
> - return FALSE;
> - }
> -
> -+/* find only frodo files */
> -+static int
> -+my_filter_frodo_file (void *data,
> -+ const char *path,
> -+ int is_dir)
> -+{
> -+ char *slash;
> -+
> -+ if (is_dir)
> -+ return FALSE;
> -+
> -+ slash = strrchr (path, '/');
> -+ if (strcmp (slash, "/frodo"))
> -+ return TRUE;
> -+
> -+ return FALSE;
> -+}
> -+
> -+
> - static int logger_called = 0;
> -
> - static int
> -@@ -905,6 +924,48 @@
> - TEST_EQ_STR (v->path, filename);
> -
> - nih_free (visited);
> -+
> -+ /* Try also inverse filter */
> -+ TEST_ALLOC_SAFE {
> -+ visitor_called = 0;
> -+ visited = nih_list_new (NULL);
> -+ }
> -+
> -+ ret = nih_dir_walk (dirname, my_filter_frodo_file,
> -+ my_visitor, NULL, &ret);
> -+
> -+ TEST_EQ (ret, 0);
> -+ TEST_EQ (visitor_called, 4);
> -+
> -+ v = (Visited *)visited->next;
> -+ TEST_EQ (v->data, &ret);
> -+ TEST_EQ_STR (v->dirname, dirname);
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/bar");
> -+ TEST_EQ_STR (v->path, filename);
> -+
> -+ v = (Visited *)v->entry.next;
> -+ TEST_EQ (v->data, &ret);
> -+ TEST_EQ_STR (v->dirname, dirname);
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/bar/frodo");
> -+ TEST_EQ_STR (v->path, filename);
> -+
> -+ v = (Visited *)v->entry.next;
> -+ TEST_EQ (v->data, &ret);
> -+ TEST_EQ_STR (v->dirname, dirname);
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/baz");
> -+ TEST_EQ_STR (v->path, filename);
> -+
> -+ v = (Visited *)v->entry.next;
> -+ TEST_EQ (v->data, &ret);
> -+ TEST_EQ_STR (v->dirname, dirname);
> -+ strcpy (filename, dirname);
> -+ strcat (filename, "/frodo");
> -+ TEST_EQ_STR (v->path, filename);
> -+
> -+ nih_free (visited);
> - }
> -
> -
> ---- libnih-1.0.3.orig/debian/control
> -+++ libnih-1.0.3/debian/control
> -@@ -0,0 +1,81 @@
> -+Source: libnih
> -+Section: libs
> -+Priority: required
> -+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
> -+XSBC-Original-Maintainer: Scott James Remnant <scott@netsplit.com>
> -+Standards-Version: 3.9.4
> -+Build-Depends: debhelper (>= 9), pkg-config (>= 0.22), libdbus-1-dev (>= 1.4), libexpat1-dev (>= 2.0.0), dbus (>= 1.4), libc6-dev (>= 2.15~) | libc6.1-dev (>= 2.15~),
> -+ dh-autoreconf, autopoint, dpkg-dev (>= 1.16.1~)
> -+# To cross build this package also needs: libdbus-1-dev:native (>= 1.4), libexpat1-dev:native (>= 2.0.0)
> -+# But :native build-deps are not supported yet, so instead one can do
> -+# $ apt-get build-dep libnih
> -+# $ apt-get build-dep libnih -aarmhf
> -+# instead to get all required build-deps
> -+Vcs-Bzr: lp:ubuntu/libnih
> -+XSC-Debian-Vcs-Git: git://git.debian.org/git/collab-maint/libnih.git
> -+XSC-Debian-Vcs-Browser: http://git.debian.org/?p=collab-maint/libnih.git;a=summary
> -+Homepage: https://launchpad.net/libnih
> -+
> -+Package: libnih1
> -+Architecture: any
> -+Pre-Depends: ${misc:Pre-Depends}, ${shlibs:Depends}, ${misc:Depends}
> -+Multi-Arch: same
> -+Description: NIH Utility Library
> -+ libnih is a light-weight "standard library" of C functions to ease the
> -+ development of other libraries and applications, especially those
> -+ normally found in /lib.
> -+ .
> -+ This package contains the shared library.
> -+
> -+Package: libnih-dev
> -+Priority: optional
> -+Section: libdevel
> -+Architecture: any
> -+Multi-Arch: same
> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> -+Description: NIH Utility Library (development files)
> -+ libnih is a light-weight "standard library" of C functions to ease the
> -+ development of other libraries and applications, especially those
> -+ normally found in /lib.
> -+ .
> -+ This package contains the static library and C header files which are
> -+ needed for developing software using libnih.
> -+
> -+Package: libnih-dbus1
> -+Architecture: any
> -+Pre-Depends: ${misc:Pre-Depends}
> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> -+Multi-Arch: same
> -+Description: NIH D-Bus Bindings Library
> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
> -+ loop provided by libnih.
> -+ .
> -+ This package contains the shared library.
> -+
> -+Package: libnih-dbus-dev
> -+Priority: optional
> -+Section: libdevel
> -+Architecture: any
> -+Multi-Arch: same
> -+Depends: libnih-dbus1 (= ${binary:Version}), libnih-dev (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> -+Recommends: nih-dbus-tool (= ${binary:Version})
> -+Description: NIH D-Bus Bindings Library (development files)
> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
> -+ loop provided by libnih.
> -+ .
> -+ This package contains the static library and C header files which are
> -+ needed for developing software using libnih-dbus.
> -+
> -+Package: nih-dbus-tool
> -+Section: devel
> -+Architecture: any
> -+Multi-Arch: foreign
> -+Depends: ${shlibs:Depends}, ${misc:Depends}
> -+Recommends: libnih-dbus-dev (= ${binary:Version})
> -+Description: NIH D-Bus Binding Tool
> -+ nih-dbus-tool generates C source code from the D-Bus Introspection XML
> -+ data provided by most services; either to make implementing the
> -+ described objects in C programs or to make proxying to the described
> -+ remote objects easier.
> -+ .
> -+ The generated code requires libnih-dbus-dev to be compiled.
> ---- libnih-1.0.3.orig/debian/libnih-dev.install
> -+++ libnih-1.0.3/debian/libnih-dev.install
> -@@ -0,0 +1,6 @@
> -+lib/*/libnih.a
> -+lib/*/libnih.so
> -+usr/include/libnih.h
> -+usr/include/nih
> -+usr/lib/*/pkgconfig/libnih.pc
> -+usr/share/aclocal/libnih.m4
> ---- libnih-1.0.3.orig/debian/libnih1.docs
> -+++ libnih-1.0.3/debian/libnih1.docs
> -@@ -0,0 +1,3 @@
> -+AUTHORS
> -+NEWS
> -+README
> ---- libnih-1.0.3.orig/debian/libnih-dbus1.install
> -+++ libnih-1.0.3/debian/libnih-dbus1.install
> -@@ -0,0 +1 @@
> -+lib/*/libnih-dbus.so.*
> ---- libnih-1.0.3.orig/debian/libnih1.install
> -+++ libnih-1.0.3/debian/libnih1.install
> -@@ -0,0 +1 @@
> -+lib/*/libnih.so.*
> ---- libnih-1.0.3.orig/debian/rules
> -+++ libnih-1.0.3/debian/rules
> -@@ -0,0 +1,54 @@
> -+#!/usr/bin/make -f
> -+
> -+include /usr/share/dpkg/architecture.mk
> -+
> -+%:
> -+ dh $@ --with autoreconf
> -+
> -+
> -+CFLAGS := -Wall -fstack-protector -fPIE $(shell dpkg-buildflags --get CFLAGS)
> -+LDFLAGS := -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -pie $(shell dpkg-buildflags --get LDFLAGS)
> -+
> -+override_dh_auto_configure:
> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
> -+else
> -+ dh_auto_configure -B build-dbus-tool/ -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> -+ --libdir=/lib/$(DEB_BUILD_MULTIARCH) \
> -+ --host=$(DEB_BUILD_GNU_TYPE)
> -+ dh_auto_build -B build-dbus-tool/ --parallel
> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> -+ NIH_DBUS_TOOL=$(CURDIR)/build-dbus-tool/nih-dbus-tool/nih-dbus-tool \
> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
> -+endif
> -+
> -+override_dh_auto_build:
> -+ dh_auto_build --parallel
> -+
> -+override_dh_auto_test:
> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> -+ dh_auto_test --parallel
> -+endif
> -+
> -+override_dh_auto_install:
> -+ dh_auto_install -- pkgconfigdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
> -+
> -+override_dh_makeshlibs:
> -+ dh_makeshlibs -plibnih1 -V 'libnih1 (>= 1.0.0)'
> -+ dh_makeshlibs -plibnih-dbus1 -V 'libnih-dbus1 (>= 1.0.0)'
> -+ dh_makeshlibs -Nlibnih1 -Nlibnih-dbus1
> -+
> -+override_dh_shlibdeps:
> -+ dh_shlibdeps
> -+ sed -i 's/2\.14/2.15/' debian/*.substvars
> -+ sed -i 's/>= 2.15)/>= 2.15~)/g' debian/*.substvars
> -+
> -+
> -+# Symlink /usr/share/doc directories together
> -+override_dh_installdocs:
> -+ dh_installdocs --link-doc=libnih1
> -+
> -+override_dh_clean:
> -+ rm -rf build-dbus-tool/
> -+ dh_clean
> ---- libnih-1.0.3.orig/debian/compat
> -+++ libnih-1.0.3/debian/compat
> -@@ -0,0 +1 @@
> -+9
> ---- libnih-1.0.3.orig/debian/nih-dbus-tool.install
> -+++ libnih-1.0.3/debian/nih-dbus-tool.install
> -@@ -0,0 +1,2 @@
> -+usr/bin/nih-dbus-tool
> -+usr/share/man/man1/nih-dbus-tool.1
> ---- libnih-1.0.3.orig/debian/copyright
> -+++ libnih-1.0.3/debian/copyright
> -@@ -0,0 +1,18 @@
> -+This is the Ubuntu package of libnih, the NIH Utility Library.
> -+
> -+Copyright © 2009 Canonical Ltd.
> -+Copyright © 2009 Scott James Remnant <scott@netsplit.com>
> -+
> -+Licence:
> -+
> -+This program is free software; you can redistribute it and/or modify
> -+it under the terms of the GNU General Public License version 2, as
> -+published by the Free Software Foundation.
> -+
> -+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.
> -+
> -+On Ubuntu systems, the complete text of the GNU General Public License
> -+can be found in ‘/usr/share/common-licenses/GPL-2’.
> ---- libnih-1.0.3.orig/debian/libnih-dbus1.postinst
> -+++ libnih-1.0.3/debian/libnih-dbus1.postinst
> -@@ -0,0 +1,53 @@
> -+#!/bin/sh
> -+
> -+set -e
> -+
> -+if [ "$1" = configure ]; then
> -+ # A dependent library of Upstart has changed, so restart Upstart
> -+ # such that it can safely unmount the root filesystem (LP: #740390)
> -+
> -+ # Query running version of Upstart, but only when we know
> -+ # that initctl will work.
> -+ #
> -+ # The calculated version string may be the null string if
> -+ # Upstart is not running (where for example an alternative
> -+ # init is running outside a chroot environment) or if the
> -+ # query failed for some reason. However, the version check
> -+ # below handles a null version string correctly.
> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> -+ awk '{print $3}'|tr -d ')' || :)
> -+
> -+ if ischroot; then
> -+ # Do not honour re-exec when requested from within a
> -+ # chroot since:
> -+ #
> -+ # (a) The version of Upstart outside might not support it.
> -+ # (b) An isolated environment such as a chroot should
> -+ # not be able to modify its containing environment.
> -+ #
> -+ # A sufficiently new Upstart will actually handle a re-exec
> -+ # request coming from telinit within a chroot correctly (by
> -+ # doing nothing) but it's simple enough to perform the check
> -+ # here and save Upstart the effort.
> -+ :
> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> -+ # We are not running inside a chroot and the running version
> -+ # of Upstart supports stateful re-exec, so we can
> -+ # restart immediately.
> -+ #
> -+ # XXX: Note that the check on the running version must
> -+ # remain *indefinitely* since it's the only safe way to
> -+ # know if stateful re-exec is supported: simply checking
> -+ # packaged version numbers is not sufficient since
> -+ # the package could be upgraded multiple times without a
> -+ # reboot.
> -+ telinit u || :
> -+ else
> -+ # Before we shutdown or reboot, we need to re-exec so that we
> -+ # can safely remount the root filesystem; we can't just do that
> -+ # here because we lose state.
> -+ touch /var/run/init.upgraded || :
> -+ fi
> -+fi
> -+
> -+#DEBHELPER#
> ---- libnih-1.0.3.orig/debian/changelog.DEBIAN
> -+++ libnih-1.0.3/debian/changelog.DEBIAN
> -@@ -0,0 +1,118 @@
> -+libnih (1.0.3-4) unstable; urgency=low
> -+
> -+ * Rebuild for new libc to update versioned dependency; this comes from
> -+ the __abort_msg dependency, dpkg-shlibs needs overriding since this is
> -+ actually a weak link, but this rebuild fixes things for now.
> -+ Closes: #625257.
> -+
> -+ -- Scott James Remnant <scott@netsplit.com> Mon, 02 May 2011 15:08:33 -0700
> -+
> -+libnih (1.0.3-3) unstable; urgency=low
> -+
> -+ * New maintainer. Closes: #624442.
> -+
> -+ -- Scott James Remnant <scott@netsplit.com> Thu, 28 Apr 2011 14:26:05 -0700
> -+
> -+libnih (1.0.3-2) unstable; urgency=low
> -+
> -+ * Bump build dependency on libdbus-1-dev and dbus to (>= 1.4) for Unix file
> -+ descriptor passing support.
> -+
> -+ -- Michael Biebl <biebl@debian.org> Thu, 10 Feb 2011 20:25:18 +0100
> -+
> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
> -+
> -+ * Rebuild with libc6-dev (>= 2.13~).
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
> -+
> -+libnih (1.0.3-1) unstable; urgency=low
> -+
> -+ * New upstream release.
> -+ * Bump debhelper compatibility level to 8 and update build dependency
> -+ accordingly.
> -+
> -+ -- Michael Biebl <biebl@debian.org> Mon, 07 Feb 2011 22:19:13 +0100
> -+
> -+libnih (1.0.2-2) unstable; urgency=low
> -+
> -+ * Install library development files to /usr/lib and not /lib.
> -+ * Remove libtool *.la files as there are no reverse dependencies referencing
> -+ them.
> -+ * Bump Standards-Version to 3.9.1. No further changes.
> -+
> -+ -- Michael Biebl <biebl@debian.org> Sun, 02 Jan 2011 21:09:40 +0100
> -+
> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
> -+
> -+ * Disable some tests on ppc64 to build an initial package.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
> -+
> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
> -+
> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> -+
> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
> -+
> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
> -+
> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
> -+ __abort_msg is available with the same signature in eglibc 2.12.
> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
> -+
> -+libnih (1.0.2-1) unstable; urgency=low
> -+
> -+ * Initial upload to Debian. Closes: #585071
> -+ * Based on the Ubuntu package for Lucid done by Scott James Remnant with the
> -+ following changes:
> -+ - Switch packages to priority optional.
> -+ - Use binary:Version instead of Source-Version.
> -+ - Bump Standards-Version to 3.8.4.
> -+ - Add Homepage and Vcs-* fields.
> -+ - Don't symlink /usr/share/doc directories.
> -+ - Refer to versioned /usr/share/common-licenses/GPL-2 file in
> -+ debian/copyright.
> -+ - List all symbols explicitly instead of using a wildcard and add symbols
> -+ introduced in 1.0.1.
> -+ - Use the symbols files to create the correct version info instead of
> -+ specifying it manually via shlibs.
> -+ - Switch to source format 3.0 (quilt).
> -+ - Add watch file to track new upstream releases.
> -+
> -+ -- Michael Biebl <biebl@debian.org> Sun, 13 Jun 2010 23:36:52 +0200
> -+
> -+libnih (1.0.1-1) lucid; urgency=low
> -+
> -+ * New upstream release:
> -+ - Add missing __nih_* symbols to linker version script so that we
> -+ can link Upstart's test suite.
> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
> -+
> -+libnih (1.0.0-2build1) lucid; urgency=low
> -+
> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
> -+ __abort_msg is available with the same signature in eglibc 2.11.
> -+ LP: #508702.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
> -+
> -+libnih (1.0.0-2) lucid; urgency=low
> -+
> -+ * debian/control: Add build-dependency on dbus so the test suite can
> -+ pass on the buildds.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
> -+
> -+libnih (1.0.0-1) lucid; urgency=low
> -+
> -+ * First upstream release. Previously this code was included in the
> -+ upstart, mountall and ureadahead source packages.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
> -+
> ---- libnih-1.0.3.orig/debian/libnih1.symbols
> -+++ libnih-1.0.3/debian/libnih1.symbols
> -@@ -0,0 +1,2 @@
> -+libnih.so.1 libnih1 #MINVER#
> -+ *@LIBNIH_1_0 1.0.0
> ---- libnih-1.0.3.orig/debian/libnih-dbus-dev.install
> -+++ libnih-1.0.3/debian/libnih-dbus-dev.install
> -@@ -0,0 +1,5 @@
> -+lib/*/libnih-dbus.a
> -+lib/*/libnih-dbus.so
> -+usr/include/libnih-dbus.h
> -+usr/include/nih-dbus
> -+usr/lib/*/pkgconfig/libnih-dbus.pc
> ---- libnih-1.0.3.orig/debian/libnih1.postinst
> -+++ libnih-1.0.3/debian/libnih1.postinst
> -@@ -0,0 +1,53 @@
> -+#!/bin/sh
> -+
> -+set -e
> -+
> -+if [ "$1" = configure ]; then
> -+ # A dependent library of Upstart has changed, so restart Upstart
> -+ # such that it can safely unmount the root filesystem (LP: #740390)
> -+
> -+ # Query running version of Upstart, but only when we know
> -+ # that initctl will work.
> -+ #
> -+ # The calculated version string may be the null string if
> -+ # Upstart is not running (where for example an alternative
> -+ # init is running outside a chroot environment) or if the
> -+ # query failed for some reason. However, the version check
> -+ # below handles a null version string correctly.
> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> -+ awk '{print $3}'|tr -d ')' || :)
> -+
> -+ if ischroot; then
> -+ # Do not honour re-exec when requested from within a
> -+ # chroot since:
> -+ #
> -+ # (a) The version of Upstart outside might not support it.
> -+ # (b) An isolated environment such as a chroot should
> -+ # not be able to modify its containing environment.
> -+ #
> -+ # A sufficiently new Upstart will actually handle a re-exec
> -+ # request coming from telinit within a chroot correctly (by
> -+ # doing nothing) but it's simple enough to perform the check
> -+ # here and save Upstart the effort.
> -+ :
> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> -+ # We are not running inside a chroot and the running version
> -+ # of Upstart supports stateful re-exec, so we can
> -+ # restart immediately.
> -+ #
> -+ # XXX: Note that the check on the running version must
> -+ # remain *indefinitely* since it's the only safe way to
> -+ # know if stateful re-exec is supported: simply checking
> -+ # packaged version numbers is not sufficient since
> -+ # the package could be upgraded multiple times without a
> -+ # reboot.
> -+ telinit u || :
> -+ else
> -+ # Before we shutdown or reboot, we need to re-exec so that we
> -+ # can safely remount the root filesystem; we can't just do that
> -+ # here because we lose state.
> -+ touch /var/run/init.upgraded || :
> -+ fi
> -+fi
> -+
> -+#DEBHELPER#
> ---- libnih-1.0.3.orig/debian/libnih-dbus1.symbols
> -+++ libnih-1.0.3/debian/libnih-dbus1.symbols
> -@@ -0,0 +1,2 @@
> -+libnih-dbus.so.1 libnih-dbus1 #MINVER#
> -+ *@LIBNIH_DBUS_1_0 1.0.0
> ---- libnih-1.0.3.orig/debian/changelog
> -+++ libnih-1.0.3/debian/changelog
> -@@ -0,0 +1,213 @@
> -+libnih (1.0.3-4ubuntu16) raring; urgency=low
> -+
> -+ * debian/{libnih1.postinst,libnih-dbus1.postinst}: Force an upgrade to
> -+ restart Upstart (to pick up new package version) if the running
> -+ instance supports it.
> -+ * Merge of important fixes from lp:~upstart-devel/libnih/nih
> -+ (LP: #776532, LP: #777097, LP: #834813, LP: #1123588).
> -+
> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 14 Mar 2013 09:14:22 +0000
> -+
> -+libnih (1.0.3-4ubuntu15) raring; urgency=low
> -+
> -+ * Enable cross-building, sans adding :native build-dependencies.
> -+ See comments in debian/control.
> -+ * Lintian fixes.
> -+
> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 08 Jan 2013 15:38:58 +0000
> -+
> -+libnih (1.0.3-4ubuntu14) raring; urgency=low
> -+
> -+ * Update dbus code generator to allow for empty lists for type 'as'.
> -+ This drops the != NULL check for NULL terminated arrays and moves the
> -+ iteration loop inside an 'if' statement.
> -+
> -+ -- Stéphane Graber <stgraber@ubuntu.com> Thu, 13 Dec 2012 10:00:27 -0500
> -+
> -+libnih (1.0.3-4ubuntu13) raring; urgency=low
> -+
> -+ [ Petr Lautrbach <plautrba@redhat.com>, Dmitrijs Ledkovs ]
> -+ * Fallback to lstat, if dirent.d_type is not available (not portable)
> -+ (LP: #672643) (Closes: #695604)
> -+
> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 11 Dec 2012 17:26:52 +0000
> -+
> -+libnih (1.0.3-4ubuntu12) raring; urgency=low
> -+
> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the (e)glibc
> -+ private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> -+
> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 25 Oct 2012 10:57:30 +0100
> -+
> -+libnih (1.0.3-4ubuntu11) quantal; urgency=low
> -+
> -+ * Addition of debian/libnih-dbus1.postinst and
> -+ debian/libnih1.postinst to force Upstart re-exec on shutdown
> -+ to avoid unmounting disks uncleanly (LP: #740390).
> -+
> -+ -- James Hunt <james.hunt@ubuntu.com> Wed, 03 Oct 2012 16:49:40 +0100
> -+
> -+libnih (1.0.3-4ubuntu10) quantal; urgency=low
> -+
> -+ * Update config.guess,sub for aarch64
> -+
> -+ -- Wookey <wookey@wookware.org> Mon, 01 Oct 2012 12:57:05 +0100
> -+
> -+libnih (1.0.3-4ubuntu9) precise; urgency=low
> -+
> -+ * Mark the nih-dbus-tool package Multi-Arch: foreign so it can be used as
> -+ a build-dependency of upstart when cross-building.
> -+
> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Wed, 15 Feb 2012 22:57:50 -0800
> -+
> -+libnih (1.0.3-4ubuntu8) precise; urgency=low
> -+
> -+ * libnih1 needs a versioned Pre-Depend on libc6 instead of just a Depend,
> -+ because libc6 itself uses runlevel from the upstart package in its
> -+ preinst, which in turn uses libnih1, which needs to be loadable (i.e.,
> -+ its symbol references resolve). We therefore need to ensure that
> -+ libnih1's dependencies are always unpacked before libnih1 itself is
> -+ unpacked. While having something further up the stack (such as upstart,
> -+ or something on top of upstart) being marked Essential: yes and with the
> -+ necessary pre-depends would let apt handle this for us with its
> -+ "immediate configuration" support, but for various reasons we don't want
> -+ to make upstart essential. LP: #508083.
> -+
> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Fri, 10 Feb 2012 12:13:25 -0800
> -+
> -+libnih (1.0.3-4ubuntu7) precise; urgency=low
> -+
> -+ * Relax dependency on libc6.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 23:43:21 +0100
> -+
> -+libnih (1.0.3-4ubuntu6) precise; urgency=low
> -+
> -+ * Rebuild with libc6-dev (>= 2.15~).
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 21:48:57 +0100
> -+
> -+libnih (1.0.3-4ubuntu5) precise; urgency=low
> -+
> -+ * Mark libnih-dev and libnih-dbus-dev Multi-Arch: same as well.
> -+
> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Sun, 06 Nov 2011 14:45:07 -0800
> -+
> -+libnih (1.0.3-4ubuntu4) precise; urgency=low
> -+
> -+ * Make libnih1 and libnih-dbus1 installable using multi-arch.
> -+
> -+ -- James Hunt <james.hunt@ubuntu.com> Tue, 01 Nov 2011 14:25:09 -0400
> -+
> -+libnih (1.0.3-4ubuntu3) precise; urgency=low
> -+
> -+ * Build to install with eglibc-2.15.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 14 Oct 2011 14:05:03 +0200
> -+
> -+libnih (1.0.3-4ubuntu2) oneiric; urgency=low
> -+
> -+ * Use dpkg-buildflags to get the build flags.
> -+ * Build with the default build flags, don't hard-code -Os. LP: #791315.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 15 Jun 2011 16:45:42 +0200
> -+
> -+libnih (1.0.3-4ubuntu1) oneiric; urgency=low
> -+
> -+ * Merge from debian unstable. Retained Ubuntu Build-Depends and Priority.
> -+
> -+ -- James Hunt <james.hunt@ubuntu.com> Mon, 23 May 2011 19:28:19 +0100
> -+
> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
> -+
> -+ * Rebuild with libc6-dev (>= 2.13~).
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
> -+
> -+libnih (1.0.3-1) natty; urgency=low
> -+
> -+ * New upstream release:
> -+ - Added support for passing file descriptors over D-Bus to nih-dbus-tool
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 23 Dec 2010 22:28:24 +0000
> -+
> -+libnih (1.0.2-2) natty; urgency=low
> -+
> -+ * Revert the previous upload. It is never acceptable to simply disable
> -+ tests, especially when it turns out that the test that was disabled
> -+ was failing because there was a serious bug that could cause kernel
> -+ panics for people on boot.
> -+
> -+ Test suites are here for a reason.
> -+
> -+ * Bumped libdbus Build-Dependency to the version with the bug fix that
> -+ caused the test suite to fail.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Wed, 08 Dec 2010 19:40:15 +0000
> -+
> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
> -+
> -+ * Disable some tests on ppc64 to build an initial package.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
> -+
> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
> -+
> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> -+
> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
> -+
> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
> -+
> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
> -+ __abort_msg is available with the same signature in eglibc 2.12.
> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
> -+
> -+libnih (1.0.2-1) maverick; urgency=low
> -+
> -+ * New upstream release:
> -+ - Rename AC_COPYRIGHT to NIH_COPYRIGHT to avoid conflict with other
> -+ packages.
> -+ - Add serial to libnih.m4
> -+ - Add NIH_WITH_LOCAL_LIBNIH macro.
> -+
> -+ * Fix use of ${Source-Version} to be ${binary:Version}
> -+ * Add debian/source/format with "1.0" to be future compatible.
> -+ * Bump standards version.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Tue, 27 Apr 2010 10:49:55 -0700
> -+
> -+libnih (1.0.1-1) lucid; urgency=low
> -+
> -+ * New upstream release:
> -+ - Add missing __nih_* symbols to linker version script so that we
> -+ can link Upstart's test suite.
> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
> -+
> -+libnih (1.0.0-2build1) lucid; urgency=low
> -+
> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
> -+ __abort_msg is available with the same signature in eglibc 2.11.
> -+ LP: #508702.
> -+
> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
> -+
> -+libnih (1.0.0-2) lucid; urgency=low
> -+
> -+ * debian/control: Add build-dependency on dbus so the test suite can
> -+ pass on the buildds.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
> -+
> -+libnih (1.0.0-1) lucid; urgency=low
> -+
> -+ * First upstream release. Previously this code was included in the
> -+ upstart, mountall and ureadahead source packages.
> -+
> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
> ---- libnih-1.0.3.orig/debian/source/format
> -+++ libnih-1.0.3/debian/source/format
> -@@ -0,0 +1 @@
> -+1.0
> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.h
> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.h
> -@@ -146,14 +146,14 @@
> - const char *name, const char *path,
> - NihDBusLostHandler lost_handler,
> - void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
> - const NihDBusInterface *interface,
> - const char *name,
> - NihDBusSignalHandler handler,
> - void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus/dbus_object.h
> -+++ libnih-1.0.3/nih-dbus/dbus_object.h
> -@@ -61,8 +61,7 @@
> - DBusConnection *connection,
> - const char *path,
> - const NihDBusInterface **interfaces,
> -- void *data)
> -- __attribute__ ((malloc));
> -+ void *data);
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus/dbus_util.h
> -+++ libnih-1.0.3/nih-dbus/dbus_util.h
> -@@ -26,7 +26,7 @@
> - NIH_BEGIN_EXTERN
> -
> - char *nih_dbus_path (const void *parent, const char *root, ...)
> -- __attribute__ ((sentinel, warn_unused_result, malloc));
> -+ __attribute__ ((sentinel, warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus/dbus_pending_data.h
> -+++ libnih-1.0.3/nih-dbus/dbus_pending_data.h
> -@@ -104,7 +104,7 @@
> - NihDBusReplyHandler handler,
> - NihDBusErrorHandler error_handler,
> - void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.c
> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.c
> -@@ -46,11 +46,11 @@
> - __attribute__ ((warn_unused_result));
> - static char *nih_dbus_proxy_name_rule (const void *parent,
> - NihDBusProxy *proxy)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static int nih_dbus_proxy_signal_destroy (NihDBusProxySignal *proxied);
> - static char *nih_dbus_proxy_signal_rule (const void *parent,
> - NihDBusProxySignal *proxied)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - /* Prototypes for handler functions */
> - static DBusHandlerResult nih_dbus_proxy_name_owner_changed (DBusConnection *connection,
> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.c
> -+++ libnih-1.0.3/nih-dbus-tool/symbol.c
> -@@ -40,10 +40,10 @@
> - /* Prototypes for static functions */
> - static char *symbol_strcat_interface (char **str, const void *parent,
> - const char *format, ...)
> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> - static char *symbol_strcat_title (char **str, const void *parent,
> - const char *format, ...)
> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> -
> -
> - /**
> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.h
> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.h
> -@@ -37,7 +37,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.h
> -+++ libnih-1.0.3/nih-dbus-tool/symbol.h
> -@@ -28,22 +28,22 @@
> - int symbol_valid (const char *symbol);
> -
> - char *symbol_from_name (const void *parent, const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char *symbol_impl (const void *parent, const char *prefix,
> - const char *interface_name, const char *name,
> - const char *postfix)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char *symbol_extern (const void *parent, const char *prefix,
> - const char *interface_symbol, const char *midfix,
> - const char *symbol, const char *postfix)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char *symbol_typedef (const void *parent, const char *prefix,
> - const char *interface_symbol, const char *midfix,
> - const char *symbol, const char *postfix)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/output.h
> -+++ libnih-1.0.3/nih-dbus-tool/output.h
> -@@ -35,9 +35,9 @@
> - __attribute__ ((warn_unused_result));
> -
> - char *output_preamble (const void *parent, const char *path)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char *output_sentinel (const void *parent, const char *path)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/parse.h
> -+++ libnih-1.0.3/nih-dbus-tool/parse.h
> -@@ -95,7 +95,7 @@
> -
> - ParseStack *parse_stack_push (const void *parent, NihList *stack,
> - ParseStackType type, void *data)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - ParseStack *parse_stack_top (NihList *stack);
> -
> - void parse_start_tag (XML_Parser xmlp, const char *tag,
> -@@ -103,7 +103,7 @@
> - void parse_end_tag (XML_Parser xmlp, const char *tag);
> -
> - Node * parse_xml (const void *parent, int fd, const char *filename)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/type.h
> -+++ libnih-1.0.3/nih-dbus-tool/type.h
> -@@ -94,43 +94,43 @@
> -
> - char * type_of (const void * parent,
> - DBusSignatureIter *iter)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - TypeVar * type_var_new (const void *parent, const char *type,
> - const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_var_to_string (const void *parent, TypeVar *var)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_var_layout (const void *parent, NihList *vars)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - TypeFunc * type_func_new (const void *parent, const char *type,
> - const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_func_to_string (const void *parent, TypeFunc *func)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_func_to_typedef (const void *parent, TypeFunc *func)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_func_layout (const void *parent, NihList *funcs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - TypeStruct *type_struct_new (const void *parent, const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_struct_to_string (const void *parent, TypeStruct *structure)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * type_to_const (char **type, const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_to_pointer (char **type, const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_to_static (char **type, const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * type_to_extern (char **type, const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * type_strcat_assert (char **block, const void *parent,
> - TypeVar *var, TypeVar *prev, TypeVar *next)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/argument.h
> -+++ libnih-1.0.3/nih-dbus-tool/argument.h
> -@@ -61,7 +61,7 @@
> -
> - Argument *argument_new (const void *parent, const char *name,
> - const char *type, NihDBusArgDir direction)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int argument_start_tag (XML_Parser xmlp, const char *tag,
> - char * const *attr)
> ---- libnih-1.0.3.orig/nih-dbus-tool/indent.h
> -+++ libnih-1.0.3/nih-dbus-tool/indent.h
> -@@ -26,9 +26,9 @@
> - NIH_BEGIN_EXTERN
> -
> - char *indent (char **str, const void *parent, int level)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char *comment (char **str, const void *parent)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/main.c
> -+++ libnih-1.0.3/nih-dbus-tool/main.c
> -@@ -52,10 +52,10 @@
> - /* Prototypes for local functions */
> - char *source_file_path (const void *parent, const char *output_path,
> - const char *filename)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char *header_file_path (const void *parent, const char *output_path,
> - const char *filename)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - /**
> ---- libnih-1.0.3.orig/nih-dbus-tool/signal.h
> -+++ libnih-1.0.3/nih-dbus-tool/signal.h
> -@@ -58,7 +58,7 @@
> - int signal_name_valid (const char *name);
> -
> - Signal * signal_new (const void *parent, const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int signal_start_tag (XML_Parser xmlp, const char *tag,
> - char * const *attr)
> -@@ -76,18 +76,18 @@
> - char * signal_object_function (const void *parent, const char *prefix,
> - Interface *interface, Signal *signal,
> - NihList *prototypes, NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * signal_proxy_function (const void *parent, const char *prefix,
> - Interface *interface, Signal *signal,
> - NihList *prototypes, NihList *typedefs,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * signal_args_array (const void *parent, const char *prefix,
> - Interface *interface, Signal *signal,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
> -+++ libnih-1.0.3/nih-dbus-tool/marshal.c
> -@@ -49,7 +49,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static char *marshal_array (const void *parent,
> - DBusSignatureIter *iter,
> - const char *iter_name, const char *name,
> -@@ -58,7 +58,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static char *marshal_struct (const void *parent,
> - DBusSignatureIter *iter,
> - const char *iter_name, const char *name,
> -@@ -67,7 +67,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - /**
> -@@ -364,6 +364,7 @@
> - nih_local TypeVar *element_len_var = NULL;
> - nih_local char * block = NULL;
> - nih_local char * vars_block = NULL;
> -+ nih_local char * loop_block = NULL;
> -
> - nih_assert (iter != NULL);
> - nih_assert (iter_name != NULL);
> -@@ -448,7 +449,7 @@
> - nih_list_add (locals, &array_iter_var->entry);
> -
> - if (dbus_type_is_fixed (element_type)) {
> -- if (! nih_strcat_sprintf (&code, parent,
> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> - "for (size_t %s = 0; %s < %s; %s++) {\n",
> - loop_name, loop_name, len_name, loop_name)) {
> - nih_free (code);
> -@@ -456,6 +457,12 @@
> - }
> - } else {
> - if (! nih_strcat_sprintf (&code, parent,
> -+ "if (%s) {\n",
> -+ name)) {
> -+ nih_free (code);
> -+ return NULL;
> -+ }
> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> - "for (size_t %s = 0; %s[%s]; %s++) {\n",
> - loop_name, name, loop_name, loop_name)) {
> - nih_free (code);
> -@@ -576,7 +583,7 @@
> - }
> -
> -
> -- if (! nih_strcat_sprintf (&code, parent,
> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> - "%s"
> - "\n"
> - "%s"
> -@@ -590,9 +597,34 @@
> - }
> -
> - /* Close the container again */
> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> -+ "}\n")) {
> -+ nih_free (code);
> -+ return NULL;
> -+ }
> -+
> -+ if (dbus_type_is_fixed (element_type)) {
> -+ if (! nih_strcat_sprintf (&code, parent,
> -+ "%s\n", loop_block)) {
> -+ nih_free (code);
> -+ return NULL;
> -+ }
> -+ }
> -+ else {
> -+ if (! indent (&loop_block, NULL, 1)) {
> -+ nih_free (code);
> -+ return NULL;
> -+ }
> -+
> -+ if (! nih_strcat_sprintf (&code, parent,
> -+ "%s"
> -+ "}\n\n", loop_block)) {
> -+ nih_free (code);
> -+ return NULL;
> -+ }
> -+ }
> -+
> - if (! nih_strcat_sprintf (&code, parent,
> -- "}\n"
> -- "\n"
> - "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
> - "%s"
> - "}\n",
> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.c
> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.c
> -@@ -51,7 +51,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static char *demarshal_array (const void *parent,
> - DBusSignatureIter *iter,
> - const char *parent_name,
> -@@ -62,7 +62,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - static char *demarshal_struct (const void *parent,
> - DBusSignatureIter *iter,
> - const char *parent_name,
> -@@ -73,7 +73,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - /**
> ---- libnih-1.0.3.orig/nih-dbus-tool/interface.h
> -+++ libnih-1.0.3/nih-dbus-tool/interface.h
> -@@ -61,7 +61,7 @@
> -
> - Interface *interface_new (const void *parent,
> - const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int interface_start_tag (XML_Parser xmlp,
> - const char *tag,
> -@@ -81,26 +81,26 @@
> - Interface *interface,
> - int with_handlers,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * interface_signals_array (const void *parent,
> - const char *prefix,
> - Interface *interface,
> - int with_filters,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * interface_properties_array (const void *parent,
> - const char *prefix,
> - Interface *interface,
> - int with_handlers,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * interface_struct (const void *parent,
> - const char *prefix,
> - Interface *interface,
> - int object,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> -
> - char * interface_proxy_get_all_function (const void *parent,
> -@@ -108,7 +108,7 @@
> - Interface *interface,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * interface_proxy_get_all_notify_function (const void *parent,
> - const char *prefix,
> -@@ -116,14 +116,14 @@
> - NihList *prototypes,
> - NihList *typedefs,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * interface_proxy_get_all_sync_function (const void *parent,
> - const char *prefix,
> - Interface *interface,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/method.h
> -+++ libnih-1.0.3/nih-dbus-tool/method.h
> -@@ -62,7 +62,7 @@
> - int method_name_valid (const char *name);
> -
> - Method * method_new (const void *parent, const char *name)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int method_start_tag (XML_Parser xmlp, const char *tag,
> - char * const *attr)
> -@@ -82,33 +82,33 @@
> - Interface *interface, Method *method,
> - NihList *prototypes, NihList *handlers,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * method_reply_function (const void *parent, const char *prefix,
> - Interface *interface, Method *method,
> - NihList *prototypes, NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * method_proxy_function (const void *parent, const char *prefix,
> - Interface *interface, Method *method,
> - NihList *prototypes, NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * method_proxy_notify_function (const void *parent, const char *prefix,
> - Interface *interface, Method *method,
> - NihList *prototypes, NihList *typedefs,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * method_proxy_sync_function (const void *parent, const char *prefix,
> - Interface *interface, Method *method,
> - NihList *prototypes, NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * method_args_array (const void *parent, const char *prefix,
> - Interface *interface, Method *method,
> - NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/node.h
> -+++ libnih-1.0.3/nih-dbus-tool/node.h
> -@@ -47,7 +47,7 @@
> - int node_path_valid (const char *name);
> -
> - Node * node_new (const void *parent, const char *path)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int node_start_tag (XML_Parser xmlp, const char *tag,
> - char * const *attr)
> -@@ -59,18 +59,18 @@
> -
> - char * node_interfaces_array (const void *parent, const char *prefix,
> - Node *node, int object, NihList *prototypes)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * node_object_functions (const void *parent, const char *prefix,
> - Node *node,
> - NihList *prototypes, NihList *handlers,
> - NihList *structs, NihList *externs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * node_proxy_functions (const void *parent, const char *prefix,
> - Node *node,
> - NihList *prototypes, NihList *structs,
> - NihList *typedefs, NihList *externs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.h
> -+++ libnih-1.0.3/nih-dbus-tool/marshal.h
> -@@ -35,7 +35,7 @@
> - const char *prefix, const char *interface_symbol,
> - const char *member_symbol, const char *symbol,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/type.c
> -+++ libnih-1.0.3/nih-dbus-tool/type.c
> -@@ -1101,7 +1101,7 @@
> - nih_assert (block != NULL);
> - nih_assert (var != NULL);
> -
> -- if (! strchr (var->type, '*'))
> -+ if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
> - return *block;
> -
> - if (next && (! strcmp (next->type, "size_t"))) {
> ---- libnih-1.0.3.orig/nih-dbus-tool/property.h
> -+++ libnih-1.0.3/nih-dbus-tool/property.h
> -@@ -65,7 +65,7 @@
> - const char *name,
> - const char *type,
> - NihDBusAccess access)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - int property_start_tag (XML_Parser xmlp, const char *tag,
> - char * const *attr)
> -@@ -88,7 +88,7 @@
> - NihList *prototypes,
> - NihList *handlers,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * property_object_set_function (const void *parent,
> - const char *prefix,
> - Interface *interface,
> -@@ -96,7 +96,7 @@
> - NihList *prototypes,
> - NihList *handlers,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * property_proxy_get_function (const void *parent,
> - const char *prefix,
> -@@ -104,7 +104,7 @@
> - Property *property,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * property_proxy_get_notify_function (const void *parent,
> - const char *prefix,
> - Interface *interface,
> -@@ -112,7 +112,7 @@
> - NihList *prototypes,
> - NihList *typedefs,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * property_proxy_set_function (const void *parent,
> - const char *prefix,
> -@@ -120,7 +120,7 @@
> - Property *property,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * property_proxy_set_notify_function (const void *parent,
> - const char *prefix,
> - Interface *interface,
> -@@ -128,7 +128,7 @@
> - NihList *prototypes,
> - NihList *typedefs,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - char * property_proxy_get_sync_function (const void *parent,
> - const char *prefix,
> -@@ -136,14 +136,14 @@
> - Property *property,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - char * property_proxy_set_sync_function (const void *parent,
> - const char *prefix,
> - Interface *interface,
> - Property *property,
> - NihList *prototypes,
> - NihList *structs)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - NIH_END_EXTERN
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_main.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_main.c
> -@@ -100,10 +100,10 @@
> -
> - extern char *source_file_path (const void *parent, const char *output_path,
> - const char *filename)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> - extern char *header_file_path (const void *parent, const char *output_path,
> - const char *filename)
> -- __attribute__ ((warn_unused_result, malloc));
> -+ __attribute__ ((warn_unused_result));
> -
> - void
> - test_source_file_path (void)
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> -@@ -12524,6 +12524,7 @@
> - dbus_message_iter_init (reply, &iter);
> -
> - dbus_message_iter_get_basic (&iter, &str_value);
> -+ TEST_NE (str_value[0], '\0');
> - TEST_TRUE (strchr ("0123456789", str_value[0]));
> -
> - dbus_message_unref (reply);
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
> -@@ -1479,39 +1479,41 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -- "\tDBusMessageIter value_element_iter;\n"
> -- "\tconst int16_t * value_element;\n"
> -- "\tsize_t value_element_len;\n"
> -+ "if (value) {\n"
> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -+ "\t\tDBusMessageIter value_element_iter;\n"
> -+ "\t\tconst int16_t * value_element;\n"
> -+ "\t\tsize_t value_element_len;\n"
> - "\n"
> -- "\tvalue_element = value[value_i];\n"
> -- "\tvalue_element_len = value_len[value_i];\n"
> -+ "\t\tvalue_element = value[value_i];\n"
> -+ "\t\tvalue_element_len = value_len[value_i];\n"
> - "\n"
> -
> -- "\t/* Marshal an array onto the message */\n"
> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal an array onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> -- "\t\tint16_t value_element_element;\n"
> -+ "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> -+ "\t\t\tint16_t value_element_element;\n"
> - "\n"
> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
> -+ "\t\t\tvalue_element_element = value_element[value_element_i];\n"
> - "\n"
> -- "\t\t/* Marshal a int16_t onto the message */\n"
> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\t/* Marshal a int16_t onto the message */\n"
> -+ "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> -+ "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\t\treturn -1;\n"
> -+ "\t\t\t}\n"
> -+ "\t\t}\n"
> -+ "\n"
> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> - "\t\t\treturn -1;\n"
> - "\t\t}\n"
> -- "\t}\n"
> -- "\n"
> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -
> -+ "\t}\n"
> - "}\n"
> - "\n"
> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> -@@ -1766,15 +1768,17 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -- "\tconst char *value_element;\n"
> -+ "if (value) {\n"
> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -+ "\t\tconst char *value_element;\n"
> - "\n"
> -- "\tvalue_element = value[value_i];\n"
> -+ "\t\tvalue_element = value[value_i];\n"
> - "\n"
> -- "\t/* Marshal a char * onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -+ "\t\t/* Marshal a char * onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\t}\n"
> - "}\n"
> - "\n"
> -@@ -1933,35 +1937,39 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -- "\tDBusMessageIter value_element_iter;\n"
> -- "\tchar * const * value_element;\n"
> -+ "if (value) {\n"
> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -+ "\t\tDBusMessageIter value_element_iter;\n"
> -+ "\t\tchar * const * value_element;\n"
> - "\n"
> -- "\tvalue_element = value[value_i];\n"
> -+ "\t\tvalue_element = value[value_i];\n"
> - "\n"
> -- "\t/* Marshal an array onto the message */\n"
> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -- "\n"
> -- "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> -- "\t\tconst char *value_element_element;\n"
> -+ "\t\t/* Marshal an array onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
> -+ "\t\tif (value_element) {\n"
> -+ "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> -+ "\t\t\t\tconst char *value_element_element;\n"
> -+ "\n"
> -+ "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
> -+ "\n"
> -+ "\t\t\t\t/* Marshal a char * onto the message */\n"
> -+ "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\t\t\treturn -1;\n"
> -+ "\t\t\t\t}\n"
> -+ "\t\t\t}\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\t\t/* Marshal a char * onto the message */\n"
> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> - "\t\t\treturn -1;\n"
> - "\t\t}\n"
> - "\t}\n"
> -- "\n"
> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> - "}\n"
> - "\n"
> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> -@@ -2194,16 +2202,18 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> -- "\tconst char *value_item2_element;\n"
> -+ "if (value_item2) {\n"
> -+ "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> -+ "\t\tconst char *value_item2_element;\n"
> - "\n"
> -- "\tvalue_item2_element = value_item2[value_item2_i];\n"
> -+ "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
> - "\n"
> -- "\t/* Marshal a char * onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -+ "\t\t/* Marshal a char * onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\t}\n"
> - "}\n"
> - "\n"
> -@@ -2642,41 +2652,43 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -- "\tDBusMessageIter value_element_iter;\n"
> -- "\tconst char * value_element_item0;\n"
> -- "\tuint32_t value_element_item1;\n"
> -- "\tconst MyStructArrayValueElement *value_element;\n"
> -+ "if (value) {\n"
> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -+ "\t\tDBusMessageIter value_element_iter;\n"
> -+ "\t\tconst char * value_element_item0;\n"
> -+ "\t\tuint32_t value_element_item1;\n"
> -+ "\t\tconst MyStructArrayValueElement *value_element;\n"
> - "\n"
> -- "\tvalue_element = value[value_i];\n"
> -+ "\t\tvalue_element = value[value_i];\n"
> - "\n"
> -- "\t/* Marshal a structure onto the message */\n"
> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a structure onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tvalue_element_item0 = value_element->item0;\n"
> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
> - "\n"
> -- "\t/* Marshal a char * onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a char * onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tvalue_element_item1 = value_element->item1;\n"
> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
> - "\n"
> -- "\t/* Marshal a uint32_t onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\t}\n"
> - "}\n"
> - "\n"
> -@@ -2912,41 +2924,43 @@
> - "\treturn -1;\n"
> - "}\n"
> - "\n"
> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -- "\tDBusMessageIter value_element_iter;\n"
> -- "\tconst char * value_element_item0;\n"
> -- "\tuint32_t value_element_item1;\n"
> -- "\tconst MyDictEntryArrayValueElement *value_element;\n"
> -+ "if (value) {\n"
> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> -+ "\t\tDBusMessageIter value_element_iter;\n"
> -+ "\t\tconst char * value_element_item0;\n"
> -+ "\t\tuint32_t value_element_item1;\n"
> -+ "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
> - "\n"
> -- "\tvalue_element = value[value_i];\n"
> -+ "\t\tvalue_element = value[value_i];\n"
> - "\n"
> -- "\t/* Marshal a structure onto the message */\n"
> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a structure onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tvalue_element_item0 = value_element->item0;\n"
> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
> - "\n"
> -- "\t/* Marshal a char * onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a char * onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tvalue_element_item1 = value_element->item1;\n"
> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
> - "\n"
> -- "\t/* Marshal a uint32_t onto the message */\n"
> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -- "\t}\n"
> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\n"
> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -- "\t\treturn -1;\n"
> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> -+ "\t\t\treturn -1;\n"
> -+ "\t\t}\n"
> - "\t}\n"
> - "}\n"
> - "\n"
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> -@@ -27359,6 +27359,7 @@
> - TEST_TRUE (unix_fd_to_str_replied);
> -
> - TEST_EQ_P (last_data, parent);
> -+ TEST_NE (last_str_value[0], '\0');
> - TEST_TRUE (strchr ("0123456789", last_str_value[0]));
> - TEST_ALLOC_PARENT (last_str_value, parent);
> -
> -@@ -27673,6 +27674,7 @@
> -
> - TEST_EQ (ret, 0);
> -
> -+ TEST_NE (str_value[0], '\0');
> - TEST_TRUE (strchr ("0123456789", str_value[0]));
> - TEST_ALLOC_PARENT (str_value, parent);
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_property.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_property.c
> -@@ -8733,7 +8733,7 @@
> - TypeVar * var;
> - NihListEntry * attrib;
> - NihDBusProxy * proxy = NULL;
> -- void * parent = NULL;
> -+ void * parent __attribute__((unused)) = NULL;
> - pid_t pid = -1;
> - int status;
> - DBusMessage * method_call;
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> -@@ -136,17 +136,19 @@
> - goto enomem;
> - }
> -
> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> -- const char *output_element;
> -+ if (output) {
> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> -+ const char *output_element;
> -
> -- output_element = output[output_i];
> -+ output_element = output[output_i];
> -
> -- /* Marshal a char * onto the message */
> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> -- dbus_message_unref (reply);
> -- reply = NULL;
> -- goto enomem;
> -+ /* Marshal a char * onto the message */
> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> -+ dbus_message_unref (reply);
> -+ reply = NULL;
> -+ goto enomem;
> -+ }
> - }
> - }
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> -@@ -7,7 +7,6 @@
> - DBusMessageIter output_iter;
> -
> - nih_assert (message != NULL);
> -- nih_assert (output != NULL);
> -
> - /* If the sender doesn't care about a reply, don't bother wasting
> - * effort constructing and sending one.
> -@@ -28,16 +27,18 @@
> - return -1;
> - }
> -
> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> -- const char *output_element;
> --
> -- output_element = output[output_i];
> --
> -- /* Marshal a char * onto the message */
> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> -- dbus_message_unref (reply);
> -- return -1;
> -+ if (output) {
> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> -+ const char *output_element;
> -+
> -+ output_element = output[output_i];
> -+
> -+ /* Marshal a char * onto the message */
> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> -+ dbus_message_unref (reply);
> -+ return -1;
> -+ }
> - }
> - }
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> -@@ -7,7 +7,6 @@
> - DBusMessageIter output_iter;
> -
> - nih_assert (message != NULL);
> -- nih_assert (output != NULL);
> -
> - /* If the sender doesn't care about a reply, don't bother wasting
> - * effort constructing and sending one.
> -@@ -28,16 +27,18 @@
> - return -1;
> - }
> -
> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> -- const char *output_element;
> --
> -- output_element = output[output_i];
> --
> -- /* Marshal a char * onto the message */
> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> -- dbus_message_unref (reply);
> -- return -1;
> -+ if (output) {
> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> -+ const char *output_element;
> -+
> -+ output_element = output[output_i];
> -+
> -+ /* Marshal a char * onto the message */
> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> -+ dbus_message_unref (reply);
> -+ return -1;
> -+ }
> - }
> - }
> -
> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> -@@ -88,17 +88,19 @@
> - goto enomem;
> - }
> -
> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> -- const char *output_element;
> -+ if (output) {
> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> -+ const char *output_element;
> -
> -- output_element = output[output_i];
> -+ output_element = output[output_i];
> -
> -- /* Marshal a char * onto the message */
> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> -- dbus_message_unref (reply);
> -- reply = NULL;
> -- goto enomem;
> -+ /* Marshal a char * onto the message */
> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> -+ dbus_message_unref (reply);
> -+ reply = NULL;
> -+ goto enomem;
> -+ }
> - }
> - }
> -
> diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> deleted file mode 100644
> index ff7a4ed10..000000000
> --- a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -# Copyright (c) 2013 LG Electronics, Inc.
> -
> -SUMMARY = "libnih library"
> -HOMEPAGE = "https://launchpad.net/libnih"
> -DESCRIPTION = "libnih is a small library for C application development \
> - containing functions that, despite its name, are not implemented \
> - elsewhere in the standard library set. \
> - \
> - libnih is roughly equivalent to other C libraries such as glib, \
> - except that its focus is on a small size and intended for \
> - applications that sit very low in the software stack, especially \
> - outside of /usr. \
> - \
> - It expressly does not reimplement functions that already exist in \
> - libraries ordinarily shipped in /lib such libc6, and does not do \
> - foolish things like invent arbitrary typedefs for perfectly good C types."
> -
> -SECTION = "libs"
> -
> -LICENSE = "GPL-2.0"
> -LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
> -
> -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 gettext
> -
> -do_configure_append () {
> - sed -i -e 's,lib/pkgconfig,${baselib}/pkgconfig,g' ${S}/nih/Makefile.in ${S}/nih-dbus/Makefile.in
> -}
> -
> -FILES_${PN}-dev += "${libdir}/pkgconfig/* \
> - ${includedir}/* \
> - ${libdir}/*.so \
> - ${datadir}/* \
> - "
> -
> -# target libnih requires native nih-dbus-tool
> -BBCLASSEXTEND = "native"
> --
> 2.17.1
>
> --
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe][PATCH] libnih: Remove
2020-01-09 21:49 ` Khem Raj
@ 2020-01-09 21:51 ` akuster808
2020-01-09 22:09 ` Khem Raj
0 siblings, 1 reply; 5+ messages in thread
From: akuster808 @ 2020-01-09 21:51 UTC (permalink / raw)
To: Khem Raj, Adrian Bunk; +Cc: openembeded-devel
On 1/9/20 1:49 PM, Khem Raj wrote:
> thanks Adrian, I wonder how many such recipes are we carrying it would
> be helpful to retire them
I suspect all the netkit ones should go.
- armin
>
> On Thu, Jan 9, 2020 at 12:33 PM Adrian Bunk <bunk@stusta.de> wrote:
>> The main user was upstart, which is no longer provided
>> by any maintained layer.
>>
>> Signed-off-by: Adrian Bunk <bunk@stusta.de>
>> ---
>> .../packagegroups/packagegroup-meta-oe.bb | 2 +-
>> ...files-also-make-it-work-with-latest-.patch | 24310 ----------------
>> ...and-SIGCHILD-are-same-on-sytem-V-sys.patch | 28 -
>> .../libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch | 3593 ---
>> .../recipes-support/libnih/libnih_1.0.3.bb | 48 -
>> 5 files changed, 1 insertion(+), 27980 deletions(-)
>> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
>> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
>> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
>> delete mode 100644 meta-oe/recipes-support/libnih/libnih_1.0.3.bb
>>
>> diff --git a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
>> index 31c3f4e95..ad968ddf9 100644
>> --- a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
>> +++ b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
>> @@ -236,7 +236,7 @@ RDEPENDS_packagegroup-meta-oe-support ="\
>> libinih inotify-tools joe lcms lcov libatasmart libbytesize \
>> libcereal libcyusbserial libee libeigen libestr libftdi libgit2 \
>> libgpiod libiio libjs-jquery libjs-sizzle liblinebreak libmicrohttpd \
>> - libmxml libnih liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
>> + libmxml liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
>> libssh libtar libteam libtinyxml2 libtinyxml libusbg libusb-compat libutempter \
>> links lio-utils lockdev log4c log4cpp logwarn libdevmapper lvm2 \
>> mailcap mbuffer mg minini \
>> 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
>> deleted file mode 100644
>> index 2c857c26f..000000000
>> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
>> +++ /dev/null
>> @@ -1,24310 +0,0 @@
>> -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/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
>> deleted file mode 100644
>> index a43b4b176..000000000
>> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
>> +++ /dev/null
>> @@ -1,28 +0,0 @@
>> -From f1b9992caf9910f9f7afae401045e42572cc84ff Mon Sep 17 00:00:00 2001
>> -From: Khem Raj <raj.khem@gmail.com>
>> -Date: Sat, 1 Apr 2017 08:50:35 -0700
>> -Subject: [PATCH] signal.c: SIGCLD and SIGCHILD are same on sytem V systems
>> -
>> -Musl drops the SIGCLD legacy
>> -
>> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
>> ----
>> - nih/signal.c | 2 +-
>> - 1 file changed, 1 insertion(+), 1 deletion(-)
>> -
>> -diff --git a/nih/signal.c b/nih/signal.c
>> -index a241df9..691c8e6 100644
>> ---- a/nih/signal.c
>> -+++ b/nih/signal.c
>> -@@ -87,7 +87,7 @@ static const SignalName signal_names[] = {
>> - { SIGSTKFLT, "STKFLT" },
>> - #endif
>> - { SIGCHLD, "CHLD" },
>> -- { SIGCLD, "CLD" },
>> -+ { SIGCHLD, "CLD" },
>> - { SIGCONT, "CONT" },
>> - { SIGSTOP, "STOP" },
>> - { SIGTSTP, "TSTP" },
>> ---
>> -2.12.1
>> -
>> diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
>> deleted file mode 100644
>> index 5d125c851..000000000
>> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
>> +++ /dev/null
>> @@ -1,3593 +0,0 @@
>> ---- libnih-1.0.3.orig/ChangeLog
>> -+++ libnih-1.0.3/ChangeLog
>> -@@ -1,3 +1,84 @@
>> -+2013-03-13 Steve Langasek <steve.langasek@ubuntu.com>
>> -+
>> -+ * nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
>> -+ passed to nih_dir_walk_scan() to ensure the nih_watch_new() filter
>> -+ function is passed the NihWatch data rather than the data passed to
>> -+ the nih_dir_walk() NihFileVisitor function (LP: #776532).
>> -+
>> -+ * nih/tests/test_watch.c (test_new): New test "with filter and data"
>> -+ to ensure filter is passed correct value.
>> -+
>> -+2013-02-28 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * Removal of gcc 'malloc' function attribute resulting from
>> -+ a clarification in its description which makes its use invalid.
>> -+ (LP: #1123588).
>> -+
>> -+2013-02-05 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * nih/logging.c: nih_log_abort_message(): Remove erroneous check
>> -+ left over from use of __abort_msg weak symbol.
>> -+ * nih/tests/test_logging.c: Remove unecessary check on whether
>> -+ __nih_abort_msg has an address.
>> -+
>> -+2012-12-13 Stéphane Graber <stgraber@ubuntu.com>
>> -+
>> -+ * nih-dbus-tool/type.c, nih-dbus-tool/marshal.c: Update dbus code
>> -+ generator to allow for empty lists for type 'as'. This drops the
>> -+ != NULL check for NULL terminated arrays and moves the iteration
>> -+ loop inside an 'if' statement.
>> -+
>> -+2012-12-11 Dmitrijs Ledkovs <dmitrijs.ledkovs@canonical.com>
>> -+
>> -+ * nih/file.c (nih_dir_walk_scan): Fallback to lstat, if the
>> -+ non-portable dirent.d_type is not available (LP: #672643) (Closes:
>> -+ #695604).
>> -+
>> -+2012-12-10 Petr Lautrbach <plautrba@redhat.com>
>> -+
>> -+ * nih/tests/test_file.c: don't use dirent.d_type (not portable)
>> -+
>> -+2012-10-25 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the
>> -+ (e)glibc private symbol __abort_msg to avoid upgrade issues (LP: #997359).
>> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
>> -+
>> -+2011-08-31 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
>> -+ (test_unix_fd_to_str): Sanity check value before invoking strchr in
>> -+ case it returns address of null (which would give a misleading test
>> -+ pass).
>> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
>> -+ (test_unix_fd_to_str, test_unix_fd_to_str_sync): Sanity check value
>> -+ before invoking strchr in case it returns address of null (which would
>> -+ give a misleading test pass).
>> -+ * nih/config.c (): nih_config_block_end: Add check to ensure strchr()
>> -+ doesn't return address of null since this would result in a misleading
>> -+ return value of TRUE.
>> -+
>> -+ * nih/string.c (nih_str_split): Fixes to avoid over-running
>> -+ input string and also returning an empty string array entry
>> -+ when repeat is true (LP: #834813).
>> -+ * nih/tests/test_string.c (test_str_split): Added a lot of new
>> -+ tests for nih_str_split().
>> -+
>> -+2011-08-26 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * nih/io.c (nih_io_select_fds): Ensure number of fds being managed
>> -+ is within limits.
>> -+
>> -+ * nih/config.c, nih/error.h, nih/io.c, nih/test_files.h: Correct
>> -+ typos in comments.
>> -+
>> -+2011-06-20 James Hunt <james.hunt@ubuntu.com>
>> -+
>> -+ * nih/watch.c (nih_watch_handle): Handle non-directory watches;
>> -+ previously a file watch resulted in an invalid file path ending in
>> -+ a single slash (LP:#777097).
>> -+ * nih/tests/test_watch.c: Added explicit test for watch on a file.
>> -+
>> - 2010-12-23 Scott James Remnant <scott@netsplit.com>
>> -
>> - * NEWS: Release 1.0.3
>> ---- libnih-1.0.3.orig/nih/watch.c
>> -+++ libnih-1.0.3/nih/watch.c
>> -@@ -2,8 +2,8 @@
>> - *
>> - * watch.c - watching of files and directories with inotify
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -71,6 +71,9 @@
>> - uint32_t events, uint32_t cookie,
>> - const char *name,
>> - int *caught_free);
>> -+static int nih_watch_walk_filter (void *data, const char *path,
>> -+ int is_dir)
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - /**
>> -@@ -91,7 +94,7 @@
>> - * sub-directories will be automatically watched.
>> - *
>> - * Additionally, the set of files and directories within @path can be
>> -- * limited by passing a @filter function which will recieve the paths and
>> -+ * limited by passing a @filter function which will receive the paths and
>> - * may return TRUE to indicate that the path received should not be watched.
>> - *
>> - * When a file is created within @path, or moved from outside this location
>> -@@ -104,7 +107,7 @@
>> - * files that exist under @path when the watch is first added. This only
>> - * occurs if the watch can be added.
>> - *
>> -- * This is a very high level wrapped around the inotify API; lower levels
>> -+ * This is a very high level wrapper around the inotify API; lower levels
>> - * can be obtained using the inotify API itself and some of the helper
>> - * functions used by this one.
>> - *
>> -@@ -185,6 +188,35 @@
>> - }
>> -
>> -
>> -+ /**
>> -+ * nih_watch_walk_filter:
>> -+ * @data: NihWatch,
>> -+ * @path: path to file,
>> -+ * @is_dir: TRUE if @path is a directory.
>> -+ *
>> -+ * Callback function for nih_dir_walk(), used by nih_watch_add() to wrap
>> -+ * the user-specified NihFileFilter (watch->filter) with a filter that can
>> -+ * take watch itself as an argument.
>> -+ *
>> -+ * Returns: TRUE if the path should be ignored, FALSE otherwise.
>> -+ **/
>> -+static int
>> -+nih_watch_walk_filter (void *data, const char *path, int is_dir)
>> -+{
>> -+ NihWatch *watch;
>> -+
>> -+ watch = (NihWatch *)data;
>> -+
>> -+ nih_assert (watch);
>> -+
>> -+ /* No filter, so accept all files */
>> -+ if (! watch->filter)
>> -+ return FALSE;
>> -+
>> -+ return watch->filter (watch->data, path, is_dir);
>> -+}
>> -+
>> -+
>> - /**
>> - * nih_watch_handle_by_wd:
>> - * @watch: watch to search,
>> -@@ -295,7 +327,7 @@
>> - * one; errors within the walk are warned automatically, so if this
>> - * fails, it means we literally couldn't watch the top-level.
>> - */
>> -- if (subdirs && (nih_dir_walk (path, watch->filter,
>> -+ if (subdirs && (nih_dir_walk (path, nih_watch_walk_filter,
>> - (NihFileVisitor)nih_watch_add_visitor,
>> - NULL, watch) < 0)) {
>> - NihError *err;
>> -@@ -494,12 +526,21 @@
>> - return;
>> - }
>> -
>> -+ /* Every other event must come with a name */
>> -+ if (name && *name) {
>> -
>> -- /* Every other event must come with a name. */
>> -- if ((! name) || strchr (name, '/'))
>> -- return;
>> -+ /* If name refers to a directory, there should be no associated
>> -+ * path - just the name of the path element.
>> -+ */
>> -+ if (strchr (name, '/'))
>> -+ return;
>> -
>> -- path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
>> -+ /* Event occured for file within a watched directory */
>> -+ path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
>> -+ } else {
>> -+ /* File event occured */
>> -+ path = NIH_MUST (nih_strdup (NULL, handle->path));
>> -+ }
>> -
>> - /* Check the filter */
>> - if (watch->filter && watch->filter (watch->data, path,
>> ---- libnih-1.0.3.orig/nih/hash.h
>> -+++ libnih-1.0.3/nih/hash.h
>> -@@ -141,7 +141,7 @@
>> - * @hash: hash table to iterate,
>> - * @iter: name of iterator variable.
>> - *
>> -- * Expans to nested for statements that iterate over each entry in each
>> -+ * Expands to nested for statements that iterate over each entry in each
>> - * bin of @hash, except for the bin head pointer, setting @iter to each
>> - * entry for the block within the loop. A variable named _@iter_i is used
>> - * to iterate the hash bins.
>> -@@ -203,7 +203,7 @@
>> - NihKeyFunction key_function,
>> - NihHashFunction hash_function,
>> - NihCmpFunction cmp_function)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihList * nih_hash_add (NihHash *hash, NihList *entry);
>> - NihList * nih_hash_add_unique (NihHash *hash, NihList *entry);
>> ---- libnih-1.0.3.orig/nih/main.h
>> -+++ libnih-1.0.3/nih/main.h
>> -@@ -138,7 +138,7 @@
>> -
>> - NihMainLoopFunc *nih_main_loop_add_func (const void *parent,
>> - NihMainLoopCb callback, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void nih_main_term_signal (void *data, NihSignal *signal);
>> -
>> ---- libnih-1.0.3.orig/nih/command.h
>> -+++ libnih-1.0.3/nih/command.h
>> -@@ -123,7 +123,7 @@
>> -
>> - NihCommand *nih_command_join (const void *parent,
>> - const NihCommand *a, const NihCommand *b)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih/config.h
>> -+++ libnih-1.0.3/nih/config.h
>> -@@ -140,10 +140,10 @@
>> - char * nih_config_next_token (const void *parent, const char *file,
>> - size_t len, size_t *pos, size_t *lineno,
>> - const char *delim, int dequote)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * nih_config_next_arg (const void *parent, const char *file,
>> - size_t len, size_t *pos, size_t *lineno)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - void nih_config_next_line (const char *file, size_t len,
>> - size_t *pos, size_t *lineno);
>> -
>> -@@ -155,15 +155,15 @@
>> -
>> - char ** nih_config_parse_args (const void *parent, const char *file,
>> - size_t len, size_t *pos, size_t *lineno)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * nih_config_parse_command (const void *parent, const char *file,
>> - size_t len, size_t *pos, size_t *lineno)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * nih_config_parse_block (const void *parent, const char *file,
>> - size_t len, size_t *pos, size_t *lineno,
>> - const char *type)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - int nih_config_skip_block (const char *file, size_t len,
>> - size_t *lineno, size_t *pos,
>> - const char *type, size_t *endpos)
>> ---- libnih-1.0.3.orig/nih/io.c
>> -+++ libnih-1.0.3/nih/io.c
>> -@@ -2,8 +2,8 @@
>> - *
>> - * io.c - file and socket input/output handling
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -165,6 +165,7 @@
>> - nih_assert (readfds != NULL);
>> - nih_assert (writefds != NULL);
>> - nih_assert (exceptfds != NULL);
>> -+ nih_assert (*nfds <= FD_SETSIZE);
>> -
>> - nih_io_init ();
>> -
>> -@@ -186,6 +187,9 @@
>> - *nfds = nih_max (*nfds, watch->fd + 1);
>> - }
>> - }
>> -+
>> -+ /* Re-check in case we exceeded the limit in the loop */
>> -+ nih_assert (*nfds <= FD_SETSIZE);
>> - }
>> -
>> - /**
>> -@@ -901,7 +905,7 @@
>> - * read and placed into the receive buffer or queue, and the reader function
>> - * is called if set.
>> - *
>> -- * Any data or messaages in the send buffer or queue are written out if the
>> -+ * Any data or messages in the send buffer or queue are written out if the
>> - * @events includes NIH_IO_WRITE.
>> - *
>> - * Errors are handled when data is read, and result in the error handled
>> -@@ -1211,7 +1215,7 @@
>> - * This function is called when the local end of a file descriptor being
>> - * managed by NihIo should be closed. Usually this is because the remote
>> - * end has been closed (without error) but it can also be because no
>> -- * error handler was given
>> -+ * error handler was given.
>> - *
>> - * Normally this just calls the close handler, or if not available, it
>> - * closes the file descriptor and frees the structure (which may be
>> -@@ -1291,7 +1295,7 @@
>> - * @io: structure to be destroyed.
>> - *
>> - * Closes the file descriptor associated with an NihIo structure so that
>> -- * the structure can be freed. IF an error is caught by closing the
>> -+ * the structure can be freed. If an error is caught by closing the
>> - * descriptor, the error handler is called instead of the error being raised;
>> - * this allows you to group your error handling in one place rather than
>> - * special-case close.
>> ---- libnih-1.0.3.orig/nih/watch.h
>> -+++ libnih-1.0.3/nih/watch.h
>> -@@ -156,7 +156,7 @@
>> - NihCreateHandler create_handler,
>> - NihModifyHandler modify_handler,
>> - NihDeleteHandler delete_handler, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_watch_add (NihWatch *watch, const char *path, int subdirs)
>> - __attribute__ ((warn_unused_result));
>> ---- libnih-1.0.3.orig/nih/tree.h
>> -+++ libnih-1.0.3/nih/tree.h
>> -@@ -344,9 +344,9 @@
>> -
>> - void nih_tree_init (NihTree *tree);
>> - NihTree * nih_tree_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - NihTreeEntry *nih_tree_entry_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihTree * nih_tree_add (NihTree *tree, NihTree *node,
>> - NihTreeWhere where);
>> ---- libnih-1.0.3.orig/nih/file.c
>> -+++ libnih-1.0.3/nih/file.c
>> -@@ -65,7 +65,7 @@
>> - /* Prototypes for static functions */
>> - static char **nih_dir_walk_scan (const char *path, NihFileFilter filter,
>> - void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static int nih_dir_walk_visit (const char *dirname, NihList *dirs,
>> - const char *path, NihFileFilter filter,
>> - NihFileVisitor visitor,
>> -@@ -619,6 +619,8 @@
>> - struct dirent *ent;
>> - char **paths;
>> - size_t npaths;
>> -+ int isdir;
>> -+ struct stat statbuf;
>> -
>> - nih_assert (path != NULL);
>> -
>> -@@ -640,7 +642,15 @@
>> - subpath = NIH_MUST (nih_sprintf (NULL, "%s/%s",
>> - path, ent->d_name));
>> -
>> -- if (filter && filter (data, subpath, ent->d_type == DT_DIR))
>> -+ if (ent->d_type == DT_UNKNOWN) {
>> -+ if ( lstat (subpath, &statbuf))
>> -+ isdir = 0;
>> -+ else
>> -+ isdir = S_ISDIR(statbuf.st_mode);
>> -+ } else
>> -+ isdir = ent->d_type == DT_DIR;
>> -+
>> -+ if (filter && filter (data, subpath, isdir))
>> - continue;
>> -
>> - NIH_MUST (nih_str_array_addp (&paths, NULL, &npaths, subpath));
>> ---- libnih-1.0.3.orig/nih/alloc.c
>> -+++ libnih-1.0.3/nih/alloc.c
>> -@@ -119,8 +119,7 @@
>> - static inline int nih_alloc_context_free (NihAllocCtx *ctx);
>> -
>> - static inline NihAllocRef *nih_alloc_ref_new (NihAllocCtx *parent,
>> -- NihAllocCtx *child)
>> -- __attribute__ ((malloc));
>> -+ NihAllocCtx *child);
>> - static inline void nih_alloc_ref_free (NihAllocRef *ref);
>> - static inline NihAllocRef *nih_alloc_ref_lookup (NihAllocCtx *parent,
>> - NihAllocCtx *child);
>> ---- libnih-1.0.3.orig/nih/timer.h
>> -+++ libnih-1.0.3/nih/timer.h
>> -@@ -59,7 +59,7 @@
>> - * @months: months (1-12),
>> - * @wdays: days of week (0-7).
>> - *
>> -- * Indidcates when scheduled timers should be run, each member is a bit
>> -+ * Indicates when scheduled timers should be run, each member is a bit
>> - * field where the bit is 1 if the timer should be run for that value and
>> - * 0 if not.
>> - **/
>> -@@ -117,14 +117,14 @@
>> -
>> - NihTimer *nih_timer_add_timeout (const void *parent, time_t timeout,
>> - NihTimerCb callback, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - NihTimer *nih_timer_add_periodic (const void *parent, time_t period,
>> - NihTimerCb callback, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - NihTimer *nih_timer_add_scheduled (const void *parent,
>> - NihTimerSchedule *schedule,
>> - NihTimerCb callback, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihTimer *nih_timer_next_due (void);
>> - void nih_timer_poll (void);
>> ---- libnih-1.0.3.orig/nih/config.c
>> -+++ libnih-1.0.3/nih/config.c
>> -@@ -2,8 +2,8 @@
>> - *
>> - * config.c - configuration file parsing
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -657,7 +657,7 @@
>> - * of the returned string are freed, the returned string will also be
>> - * freed.
>> - *
>> -- * Returns: the command found or NULL on raised error.
>> -+ * Returns: the newly allocated command found or NULL on raised error.
>> - **/
>> - char *
>> - nih_config_parse_command (const void *parent,
>> -@@ -714,7 +714,7 @@
>> - * @lineno: line number,
>> - * @type: block identifier.
>> - *
>> -- * Extracts a block of text from @line, stopping when the pharse "end @type"
>> -+ * Extracts a block of text from @line, stopping when the phrase "end @type"
>> - * is encountered without any quotes or blackslash escaping within it.
>> - *
>> - * @file may be a memory mapped file, in which case @pos should be given
>> -@@ -950,7 +950,7 @@
>> - return FALSE;
>> -
>> - /* Must be whitespace after */
>> -- if (! strchr (NIH_CONFIG_WS, file[p + 3]))
>> -+ if (file[p + 3] && ! strchr (NIH_CONFIG_WS, file[p + 3]))
>> - return FALSE;
>> -
>> - /* Find the second word */
>> ---- libnih-1.0.3.orig/nih/option.h
>> -+++ libnih-1.0.3/nih/option.h
>> -@@ -124,11 +124,11 @@
>> - char ** nih_option_parser (const void *parent,
>> - int argc, char *argv[],
>> - NihOption *options, int break_nonopt)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihOption *nih_option_join (const void *parent,
>> - const NihOption *a, const NihOption *b)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_option_count (NihOption *option, const char *arg);
>> - int nih_option_int (NihOption *option, const char *arg);
>> ---- libnih-1.0.3.orig/nih/signal.h
>> -+++ libnih-1.0.3/nih/signal.h
>> -@@ -76,7 +76,7 @@
>> -
>> - NihSignal * nih_signal_add_handler (const void *parent, int signum,
>> - NihSignalHandler handler, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void nih_signal_handler (int signum);
>> - void nih_signal_poll (void);
>> ---- libnih-1.0.3.orig/nih/list.h
>> -+++ libnih-1.0.3/nih/list.h
>> -@@ -37,7 +37,7 @@
>> - * after a known entry, and remove an entry from the list.
>> - *
>> - * List entries may be created in one of two ways. The most common is to
>> -- * embed the NihList structure as the frist member of your own structure,
>> -+ * embed the NihList structure as the first member of your own structure,
>> - * and initialise it with nih_list_init() after allocating the structure.
>> - * Alternatively you may create NihListEntry structures with
>> - * nih_list_entry_new() and point at your own data from them.
>> -@@ -196,10 +196,10 @@
>> -
>> - void nih_list_init (NihList *entry);
>> - NihList * nih_list_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihListEntry *nih_list_entry_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - NihList * nih_list_add (NihList *list, NihList *entry);
>> ---- libnih-1.0.3.orig/nih/logging.c
>> -+++ libnih-1.0.3/nih/logging.c
>> -@@ -39,11 +39,11 @@
>> -
>> -
>> - /**
>> -- * __abort_msg:
>> -+ * __nih_abort_msg:
>> - *
>> -- * A glibc variable that keeps the assertion message in the core dump.
>> -+ * A variable that keeps the assertion message in the core dump.
>> - **/
>> --extern char *__abort_msg __attribute__ ((weak));
>> -+char *__nih_abort_msg = NULL;
>> -
>> - /**
>> - * logger:
>> -@@ -114,19 +114,16 @@
>> - * nih_log_abort_message:
>> - * @message: message to be logged.
>> - *
>> -- * Save @message in the glibc __abort_msg variable so it can be retrieved
>> -+ * Save @message in the __nih_abort_msg variable so it can be retrieved
>> - * by debuggers if we should crash at this point.
>> - **/
>> - static void
>> - nih_log_abort_message (const char *message)
>> - {
>> -- if (! &__abort_msg)
>> -- return;
>> -+ if (__nih_abort_msg)
>> -+ nih_discard (__nih_abort_msg);
>> -
>> -- if (__abort_msg)
>> -- nih_discard (__abort_msg);
>> --
>> -- __abort_msg = NIH_MUST (nih_strdup (NULL, message));
>> -+ __nih_abort_msg = NIH_MUST (nih_strdup (NULL, message));
>> - }
>> -
>> - /**
>> ---- libnih-1.0.3.orig/nih/test_files.h
>> -+++ libnih-1.0.3/nih/test_files.h
>> -@@ -1,7 +1,7 @@
>> - /* libnih
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -39,7 +39,7 @@
>> - * TEST_FILENAME:
>> - * @_var: variable to store filename in.
>> - *
>> -- * Generate a filename that may be used for testing, it's unlinked it if
>> -+ * Generate a filename that may be used for testing, it's unlinked if it
>> - * exists and it's up to you to unlink it when done. @_var should be at
>> - * least PATH_MAX long.
>> - **/
>> ---- libnih-1.0.3.orig/nih/test_process.h
>> -+++ libnih-1.0.3/nih/test_process.h
>> -@@ -36,7 +36,7 @@
>> - * Spawn a child in which a test can be performed without affecting the
>> - * main flow of the process. The pid of the child is stored in @_pid.
>> - *
>> -- * This macro ensures that the child has begun exectution before the
>> -+ * This macro ensures that the child has begun execution before the
>> - * parent is allowed to continue through the usual use of a pipe.
>> - *
>> - * A block of code should follow this macro, which is the code that will
>> ---- libnih-1.0.3.orig/nih/child.h
>> -+++ libnih-1.0.3/nih/child.h
>> -@@ -98,7 +98,7 @@
>> - NihChildWatch *nih_child_add_watch (const void *parent, pid_t pid,
>> - NihChildEvents events,
>> - NihChildHandler handler, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void nih_child_poll (void);
>> -
>> ---- libnih-1.0.3.orig/nih/alloc.h
>> -+++ libnih-1.0.3/nih/alloc.h
>> -@@ -299,7 +299,7 @@
>> - * It is permissible to take references to foo within its scope, or by
>> - * functions called, in which case it will not be freed. Also it is
>> - * generally nonsensical to allocate with a parent, since this too will
>> -- * prevent it from beign freed.
>> -+ * prevent it from being freed.
>> - **/
>> - #define nih_local __attribute__ ((cleanup(_nih_discard_local)))
>> -
>> -@@ -307,11 +307,11 @@
>> - NIH_BEGIN_EXTERN
>> -
>> - void * nih_alloc (const void *parent, size_t size)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void * nih_realloc (void *ptr, const void *parent,
>> - size_t size)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_free (void *ptr);
>> - int nih_discard (void *ptr);
>> ---- libnih-1.0.3.orig/nih/io.h
>> -+++ libnih-1.0.3/nih/io.h
>> -@@ -269,7 +269,7 @@
>> - NihIoWatch * nih_io_add_watch (const void *parent, int fd,
>> - NihIoEvents events,
>> - NihIoWatcher watcher, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void nih_io_select_fds (int *nfds, fd_set *readfds,
>> - fd_set *writefds, fd_set *exceptfds);
>> -@@ -278,12 +278,12 @@
>> -
>> -
>> - NihIoBuffer * nih_io_buffer_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_io_buffer_resize (NihIoBuffer *buffer, size_t grow);
>> - char * nih_io_buffer_pop (const void *parent,
>> - NihIoBuffer *buffer, size_t *len)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - void nih_io_buffer_shrink (NihIoBuffer *buffer, size_t len);
>> - int nih_io_buffer_push (NihIoBuffer *buffer,
>> - const char *str, size_t len)
>> -@@ -291,7 +291,7 @@
>> -
>> -
>> - NihIoMessage *nih_io_message_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_io_message_add_control (NihIoMessage *message, int level,
>> - int type, socklen_t len,
>> -@@ -300,7 +300,7 @@
>> -
>> - NihIoMessage *nih_io_message_recv (const void *parent, int fd,
>> - size_t *len)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - ssize_t nih_io_message_send (NihIoMessage *message, int fd)
>> - __attribute__ ((warn_unused_result));
>> -
>> -@@ -310,7 +310,7 @@
>> - NihIoCloseHandler close_handler,
>> - NihIoErrorHandler error_handler,
>> - void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - void nih_io_shutdown (NihIo *io);
>> - int nih_io_destroy (NihIo *io);
>> -
>> -@@ -319,14 +319,14 @@
>> -
>> - char * nih_io_read (const void *parent, NihIo *io,
>> - size_t *len)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - int nih_io_write (NihIo *io, const char *str,
>> - size_t len)
>> - __attribute__ ((warn_unused_result));
>> -
>> - char * nih_io_get (const void *parent, NihIo *io,
>> - const char *delim)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int nih_io_printf (NihIo *io, const char *format, ...)
>> - __attribute__ ((warn_unused_result, format (printf, 2, 3)));
>> ---- libnih-1.0.3.orig/nih/test_output.h
>> -+++ libnih-1.0.3/nih/test_output.h
>> -@@ -61,10 +61,10 @@
>> -
>> - /**
>> - * TEST_FEATURE:
>> -- * @_feat: name of function feature being tested.
>> -+ * @_feat: name of function or group feature being tested.
>> - *
>> -- * Output a message indicating that a sub-test of a function is being
>> -- * performed, specifically the feature named _feat.
>> -+ * Output a message indicating that a sub-test of a function or
>> -+ * group is being performed, specifically the feature named _feat.
>> - **/
>> - #define TEST_FEATURE(_feat) \
>> - printf ("...%s\n", _feat);
>> ---- libnih-1.0.3.orig/nih/error.h
>> -+++ libnih-1.0.3/nih/error.h
>> -@@ -1,7 +1,7 @@
>> - /* libnih
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -111,7 +111,7 @@
>> - * @message: human-readable message.
>> - *
>> - * Raises an error with the given details in the current error context,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - *
>> - * @message should be a static string, as it will not be freed when the
>> -@@ -126,7 +126,7 @@
>> - * @format: format string for human-readable message.
>> - *
>> - * Raises an error with the given details in the current error context,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - *
>> - * The human-readable message for the error is parsed according to @format,
>> -@@ -140,7 +140,7 @@
>> - * nih_error_raise_system:
>> - *
>> - * Raises an error with details taken from the current value of errno,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - **/
>> - #define nih_error_raise_system() \
>> -@@ -162,7 +162,7 @@
>> - * @error: existing object to raise.
>> - *
>> - * Raises the existing error object in the current error context,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - *
>> - * This is normally used to raise a taken error that has not been handled,
>> -@@ -182,7 +182,7 @@
>> - * @message: human-readable message.
>> - *
>> - * Raises an error with the given details in the current error context,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - *
>> - * Will return from the current function with @retval, which may be left
>> -@@ -199,7 +199,7 @@
>> - * @retval: return value for function.
>> - *
>> - * Raises an error with details taken from the current value of errno,
>> -- * if an unhandled error already exists then an error message is emmitted
>> -+ * if an unhandled error already exists then an error message is emitted
>> - * through the logging system; you should try to avoid this.
>> - *
>> - * Will return from the current function with @retval, which may be left
>> ---- libnih-1.0.3.orig/nih/string.h
>> -+++ libnih-1.0.3/nih/string.h
>> -@@ -35,60 +35,60 @@
>> - NIH_BEGIN_EXTERN
>> -
>> - char * nih_sprintf (const void *parent, const char *format, ...)
>> -- __attribute__ ((format (printf, 2, 3), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 2, 3), warn_unused_result));
>> -
>> - char * nih_vsprintf (const void *parent, const char *format,
>> - va_list args)
>> -- __attribute__ ((format (printf, 2, 0), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 2, 0), warn_unused_result));
>> -
>> - char * nih_strdup (const void *parent, const char *str)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * nih_strndup (const void *parent, const char *str, size_t len)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * nih_strcat (char **str, const void *parent, const char *src)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * nih_strncat (char **str, const void *parent, const char *src,
>> - size_t len)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * nih_strcat_sprintf (char **str, const void *parent,
>> - const char *format, ...)
>> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
>> - char * nih_strcat_vsprintf (char **str, const void *parent,
>> - const char *format, va_list args)
>> -- __attribute__ ((format (printf, 3, 0), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 3, 0), warn_unused_result));
>> -
>> - char **nih_str_split (const void *parent, const char *str,
>> - const char *delim, int repeat)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char **nih_str_array_new (const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char **nih_str_array_add (char ***array, const void *parent, size_t *len,
>> - const char *str)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char **nih_str_array_addn (char ***array, const void *parent, size_t *len,
>> - const char *str, size_t strlen)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char **nih_str_array_addp (char ***array, const void *parent, size_t *len,
>> - void *ptr)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char **nih_str_array_copy (const void *parent, size_t *len,
>> - char * const *array)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char **nih_str_array_append (char ***array, const void *parent, size_t *len,
>> - char * const *args)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * nih_str_wrap (const void *parent, const char *str, size_t len,
>> - size_t first_indent, size_t indent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - size_t nih_str_screen_width (void);
>> - char * nih_str_screen_wrap (const void *parent, const char *str,
>> - size_t first_indent, size_t indent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih/string.c
>> -+++ libnih-1.0.3/nih/string.c
>> -@@ -405,7 +405,7 @@
>> - const char *ptr;
>> -
>> - /* Skip initial delimiters */
>> -- while (repeat && strchr (delim, *str))
>> -+ while (repeat && *str && strchr (delim, *str))
>> - str++;
>> -
>> - /* Find the end of the token */
>> -@@ -413,6 +413,13 @@
>> - while (*str && (! strchr (delim, *str)))
>> - str++;
>> -
>> -+ /* Don't create an empty string array element in repeat
>> -+ * mode if there is no token (as a result of a
>> -+ * duplicated delimiter character).
>> -+ */
>> -+ if (repeat && (str == ptr))
>> -+ continue;
>> -+
>> - if (! nih_str_array_addn (&array, parent, &len,
>> - ptr, str - ptr)) {
>> - nih_free (array);
>> ---- libnih-1.0.3.orig/nih/file.h
>> -+++ libnih-1.0.3/nih/file.h
>> -@@ -82,7 +82,7 @@
>> -
>> - char *nih_file_read (const void *parent, const char *path,
>> - size_t *length)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void *nih_file_map (const char *path, int flags, size_t *length)
>> - __attribute__ ((warn_unused_result));
>> ---- libnih-1.0.3.orig/nih/tests/test_option.c
>> -+++ libnih-1.0.3/nih/tests/test_option.c
>> -@@ -1574,7 +1574,7 @@
>> - output = tmpfile ();
>> - TEST_CHILD (pid) {
>> - TEST_DIVERT_STDOUT (output) {
>> -- char **args;
>> -+ char **args __attribute__((unused));
>> -
>> - args = nih_option_parser (NULL, argc, argv,
>> - options, FALSE);
>> -@@ -1652,7 +1652,7 @@
>> - unsetenv ("COLUMNS");
>> -
>> - TEST_DIVERT_STDOUT (output) {
>> -- char **args;
>> -+ char **args __attribute__((unused));
>> -
>> - args = nih_option_parser (NULL, argc, argv,
>> - options, FALSE);
>> ---- libnih-1.0.3.orig/nih/tests/test_logging.c
>> -+++ libnih-1.0.3/nih/tests/test_logging.c
>> -@@ -31,7 +31,7 @@
>> - #include <nih/main.h>
>> -
>> -
>> --extern char *__abort_msg __attribute__ ((weak));
>> -+extern char *__nih_abort_msg;
>> -
>> - static NihLogLevel last_priority = NIH_LOG_UNKNOWN;
>> - static char * last_message = NULL;
>> -@@ -156,68 +156,63 @@
>> - }
>> -
>> -
>> -- /* Check that a fatal message is also stored in the glibc __abort_msg
>> -+ /* Check that a fatal message is also stored in the __nih_abort_msg
>> - * variable.
>> - */
>> -- if (&__abort_msg) {
>> -- TEST_FEATURE ("with fatal message");
>> -- TEST_ALLOC_FAIL {
>> -- __abort_msg = NULL;
>> -- last_priority = NIH_LOG_UNKNOWN;
>> -- last_message = NULL;
>> --
>> -- ret = nih_log_message (NIH_LOG_FATAL,
>> -- "message with %s %d formatting",
>> -- "some", 20);
>> --
>> -- TEST_EQ (ret, 0);
>> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
>> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
>> --
>> -- TEST_NE_P (__abort_msg, NULL);
>> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
>> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
>> -+ TEST_FEATURE ("with fatal message");
>> -+ TEST_ALLOC_FAIL {
>> -+ __nih_abort_msg = NULL;
>> -+ last_priority = NIH_LOG_UNKNOWN;
>> -+ last_message = NULL;
>> -
>> -- free (last_message);
>> -- }
>> -+ ret = nih_log_message (NIH_LOG_FATAL,
>> -+ "message with %s %d formatting",
>> -+ "some", 20);
>> -
>> -+ TEST_EQ (ret, 0);
>> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
>> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
>> -
>> -- /* Check that a fatal message can safely overwrite one already stored
>> -- * in the glibc __abort_msg variable.
>> -- */
>> -- TEST_FEATURE ("with second fatal message");
>> -- TEST_ALLOC_FAIL {
>> -- TEST_ALLOC_SAFE {
>> -- msg = nih_strdup (NULL, "test");
>> -- }
>> --
>> -- __abort_msg = msg;
>> -- TEST_FREE_TAG (msg);
>> --
>> -- last_priority = NIH_LOG_UNKNOWN;
>> -- last_message = NULL;
>> --
>> -- ret = nih_log_message (NIH_LOG_FATAL,
>> -- "message with %s %d formatting",
>> -- "some", 20);
>> --
>> -- TEST_EQ (ret, 0);
>> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
>> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
>> --
>> -- TEST_FREE (msg);
>> --
>> -- TEST_NE_P (__abort_msg, NULL);
>> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
>> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
>> -+ TEST_NE_P (__nih_abort_msg, NULL);
>> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
>> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
>> -
>> -- free (last_message);
>> -- }
>> -- } else {
>> -- printf ("SKIP: __abort_msg not available\n");
>> -+ free (last_message);
>> - }
>> -
>> -
>> -+ /* Check that a fatal message can safely overwrite one already stored
>> -+ * in the __nih_abort_msg variable.
>> -+ */
>> -+ TEST_FEATURE ("with second fatal message");
>> -+ TEST_ALLOC_FAIL {
>> -+ TEST_ALLOC_SAFE {
>> -+ msg = nih_strdup (NULL, "test");
>> -+ }
>> -+
>> -+ __nih_abort_msg = msg;
>> -+ TEST_FREE_TAG (msg);
>> -+
>> -+ last_priority = NIH_LOG_UNKNOWN;
>> -+ last_message = NULL;
>> -+
>> -+ ret = nih_log_message (NIH_LOG_FATAL,
>> -+ "message with %s %d formatting",
>> -+ "some", 20);
>> -+
>> -+ TEST_EQ (ret, 0);
>> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
>> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
>> -+
>> -+ TEST_FREE (msg);
>> -+
>> -+ TEST_NE_P (__nih_abort_msg, NULL);
>> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
>> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
>> -+
>> -+ free (last_message);
>> -+ }
>> -+
>> - /* Check that the nih_debug macro wraps the call properly and
>> - * includes the function in which the message occurred.
>> - */
>> ---- libnih-1.0.3.orig/nih/tests/test_hash.c
>> -+++ libnih-1.0.3/nih/tests/test_hash.c
>> -@@ -470,7 +470,8 @@
>> - test_lookup (void)
>> - {
>> - NihHash *hash;
>> -- NihList *entry1, *entry2, *entry3, *ptr;
>> -+ NihList *entry1, *entry2, *ptr;
>> -+ NihList *entry3 __attribute__((unused));
>> -
>> - TEST_FUNCTION ("nih_hash_lookup");
>> - hash = nih_hash_string_new (NULL, 0);
>> ---- libnih-1.0.3.orig/nih/tests/test_main.c
>> -+++ libnih-1.0.3/nih/tests/test_main.c
>> -@@ -457,7 +457,7 @@
>> - test_main_loop (void)
>> - {
>> - NihMainLoopFunc *func;
>> -- NihTimer *timer;
>> -+ NihTimer *timer __attribute__((unused));
>> - int ret;
>> -
>> - /* Check that we can run through the main loop, and that the
>> ---- libnih-1.0.3.orig/nih/tests/test_watch.c
>> -+++ libnih-1.0.3/nih/tests/test_watch.c
>> -@@ -2,8 +2,8 @@
>> - *
>> - * test_watch.c - test suite for nih/watch.c
>> - *
>> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
>> -- * Copyright © 2009 Canonical Ltd.
>> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
>> -+ * Copyright © 2011 Canonical Ltd.
>> - *
>> - * This program is free software; you can redistribute it and/or modify
>> - * it under the terms of the GNU General Public License version 2, as
>> -@@ -39,6 +39,8 @@
>> - #include <nih/error.h>
>> - #include <nih/logging.h>
>> -
>> -+/* Read "The Hitchhikers Guide to the Galaxy" */
>> -+#define FILTER_VALUE 42
>> -
>> - static int
>> - my_filter (void *data,
>> -@@ -54,6 +56,26 @@
>> - return FALSE;
>> - }
>> -
>> -+/* Set by my_filter2 () so it knows if it has already been called */
>> -+static int my_filter2_called = 0;
>> -+
>> -+static int
>> -+my_filter2 (int *value,
>> -+ const char *path,
>> -+ int is_dir)
>> -+{
>> -+ /* we only want to toggle the value once */
>> -+ if (my_filter2_called)
>> -+ return TRUE;
>> -+
>> -+ my_filter2_called = 1;
>> -+
>> -+ nih_assert (value && *value == FILTER_VALUE);
>> -+ *value = 0;
>> -+
>> -+ return FALSE;
>> -+}
>> -+
>> - static int create_called = 0;
>> - static int modify_called = 0;
>> - static int delete_called = 0;
>> -@@ -553,6 +575,44 @@
>> - nih_free (watch);
>> - }
>> -
>> -+ /* Ensure the file filter gets passed the correct data pointer.
>> -+ */
>> -+ TEST_FEATURE ("with filter and data");
>> -+
>> -+ /* Ensure we have a new directory */
>> -+ TEST_FILENAME (dirname);
>> -+ mkdir (dirname, 0755);
>> -+
>> -+ /* Create a single file */
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/foo");
>> -+
>> -+ fd = fopen (filename, "w");
>> -+ fprintf (fd, "test\n");
>> -+ fclose (fd);
>> -+
>> -+ TEST_ALLOC_FAIL {
>> -+ int watch_data = FILTER_VALUE;
>> -+
>> -+ /* Reset required to appease TEST_ALLOC_FAIL */
>> -+ my_filter2_called = 0;
>> -+
>> -+ watch = nih_watch_new (NULL, dirname,
>> -+ TRUE, TRUE,
>> -+ (NihFileFilter)my_filter2,
>> -+ NULL, NULL, NULL,
>> -+ &watch_data);
>> -+
>> -+ TEST_NE_P (watch, NULL);
>> -+
>> -+ /* Ensure the filter was called and changed the value */
>> -+
>> -+ TEST_NE (my_filter2_called, 0);
>> -+ TEST_EQ (watch_data, 0);
>> -+
>> -+ nih_free (watch);
>> -+ }
>> -+
>> - strcpy (filename, dirname);
>> - strcat (filename, "/bar");
>> - chmod (filename, 0755);
>> -@@ -946,13 +1006,82 @@
>> - nih_error_init ();
>> -
>> - TEST_FILENAME (dirname);
>> -- mkdir (dirname, 0755);
>> -+ TEST_EQ (mkdir (dirname, 0755), 0);
>> -
>> -- watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
>> -- my_create_handler, my_modify_handler,
>> -+ TEST_FEATURE ("with watched file");
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/foo");
>> -+
>> -+ /* Create file first since we don't set a create handler on the
>> -+ * watch.
>> -+ */
>> -+ fd = fopen (filename, "w");
>> -+ fprintf (fd, "bar\n");
>> -+ fclose (fd);
>> -+
>> -+ create_called = 0;
>> -+ modify_called = 0;
>> -+ delete_called = 0;
>> -+ logger_called = 0;
>> -+ last_path = NULL;
>> -+ last_watch = NULL;
>> -+ last_data = NULL;
>> -+
>> -+ watch = nih_watch_new (NULL, filename, FALSE, FALSE, NULL,
>> -+ NULL, my_modify_handler,
>> - my_delete_handler, &watch);
>> -+ TEST_NE_P (watch, NULL);
>> -+
>> -+ /* Now, modify the existing file to trigger the modify handler. */
>> -+ fd = fopen (filename, "a+");
>> -+ fprintf (fd, "baz\n");
>> -+ fclose (fd);
>> -+
>> -+ nfds = 0;
>> -+ FD_ZERO (&readfds);
>> -+ FD_ZERO (&writefds);
>> -+ FD_ZERO (&exceptfds);
>> -+
>> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
>> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
>> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
>> -+
>> -+ TEST_EQ_STR (watch->path, filename);
>> -+
>> -+ /* Ensure no regression to old behaviour (LP:#777097) */
>> -+ TEST_NE (last_path[ strlen(last_path) - 1 ], '/');
>> -+
>> -+ TEST_EQ_STR (last_path, filename);
>> -+ TEST_EQ (modify_called, 1);
>> -+
>> -+ unlink (filename);
>> -+
>> -+ nfds = 0;
>> -+ FD_ZERO (&readfds);
>> -+ FD_ZERO (&writefds);
>> -+ FD_ZERO (&exceptfds);
>> -+
>> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
>> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
>> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
>> -
>> -+ TEST_EQ (delete_called, 1);
>> -
>> -+ rmdir (filename);
>> -+ nih_free (last_path);
>> -+
>> -+ create_called = 0;
>> -+ modify_called = 0;
>> -+ delete_called = 0;
>> -+ logger_called = 0;
>> -+ last_path = NULL;
>> -+ last_watch = NULL;
>> -+ last_data = NULL;
>> -+
>> -+
>> -+ watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
>> -+ my_create_handler, my_modify_handler,
>> -+ my_delete_handler, &watch);
>> - /* Check that creating a file within the directory being watched
>> - * results in the create handler being called, and passed the full
>> - * path of the created file to it.
>> ---- libnih-1.0.3.orig/nih/tests/test_string.c
>> -+++ libnih-1.0.3/nih/tests/test_string.c
>> -@@ -619,6 +619,215 @@
>> - nih_free (array);
>> - }
>> -
>> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
>> -+ "characters at string start");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "\t\tthis is a test", " \t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
>> -+ for (i = 0; i < 6; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "");
>> -+ TEST_EQ_STR (array[1], "");
>> -+ TEST_EQ_STR (array[2], "this");
>> -+ TEST_EQ_STR (array[3], "is");
>> -+ TEST_EQ_STR (array[4], "a");
>> -+ TEST_EQ_STR (array[5], "test");
>> -+ TEST_EQ_P (array[6], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
>> -+ "characters at string start");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, " \tthis is a test", " \t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
>> -+ for (i = 0; i < 6; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "");
>> -+ TEST_EQ_STR (array[1], "");
>> -+ TEST_EQ_STR (array[2], "this");
>> -+ TEST_EQ_STR (array[3], "is");
>> -+ TEST_EQ_STR (array[4], "a");
>> -+ TEST_EQ_STR (array[5], "test");
>> -+ TEST_EQ_P (array[6], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
>> -+ "characters within string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "this is a\t\ttest", " \t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 8);
>> -+ for (i = 0; i < 7; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "this");
>> -+ TEST_EQ_STR (array[1], "is");
>> -+ TEST_EQ_STR (array[2], "");
>> -+ TEST_EQ_STR (array[3], "");
>> -+ TEST_EQ_STR (array[4], "a");
>> -+ TEST_EQ_STR (array[5], "");
>> -+ TEST_EQ_STR (array[6], "test");
>> -+ TEST_EQ_P (array[7], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
>> -+ "characters within string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "this is \n\ta\ttest", " \t\n", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
>> -+ for (i = 0; i < 6; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "this");
>> -+ TEST_EQ_STR (array[1], "is");
>> -+ TEST_EQ_STR (array[2], "");
>> -+ TEST_EQ_STR (array[3], "");
>> -+ TEST_EQ_STR (array[4], "a");
>> -+ TEST_EQ_STR (array[5], "test");
>> -+ TEST_EQ_P (array[6], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
>> -+ "characters at string end");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "this is a test ", " \t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
>> -+ for (i = 0; i < 5; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "this");
>> -+ TEST_EQ_STR (array[1], "is");
>> -+ TEST_EQ_STR (array[2], "a");
>> -+ TEST_EQ_STR (array[3], "test");
>> -+ TEST_EQ_STR (array[4], "");
>> -+ TEST_EQ_P (array[5], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
>> -+ "characters at string end");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "this is a test \t", " \t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
>> -+ for (i = 0; i < 5; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "this");
>> -+ TEST_EQ_STR (array[1], "is");
>> -+ TEST_EQ_STR (array[2], "a");
>> -+ TEST_EQ_STR (array[3], "test");
>> -+ TEST_EQ_STR (array[4], "");
>> -+ TEST_EQ_P (array[5], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
>> -+ "characters at beginning, middle and end of string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, " this is\n\n\na test\t\t\t", " \t\n", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 12);
>> -+ for (i = 0; i < 11; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "");
>> -+ TEST_EQ_STR (array[1], "");
>> -+ TEST_EQ_STR (array[2], "");
>> -+ TEST_EQ_STR (array[3], "this");
>> -+ TEST_EQ_STR (array[4], "is");
>> -+ TEST_EQ_STR (array[5], "");
>> -+ TEST_EQ_STR (array[6], "");
>> -+ TEST_EQ_STR (array[7], "a");
>> -+ TEST_EQ_STR (array[8], "test");
>> -+ TEST_EQ_STR (array[9], "");
>> -+ TEST_EQ_STR (array[10], "");
>> -+ TEST_EQ_P (array[11], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
>> -+ "characters at beginning, middle and end of string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, ": \nthis is\t \n:a test:\n ", "\n :\t", FALSE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 13);
>> -+ for (i = 0; i < 12; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "");
>> -+ TEST_EQ_STR (array[1], "");
>> -+ TEST_EQ_STR (array[2], "");
>> -+ TEST_EQ_STR (array[3], "this");
>> -+ TEST_EQ_STR (array[4], "is");
>> -+ TEST_EQ_STR (array[5], "");
>> -+ TEST_EQ_STR (array[6], "");
>> -+ TEST_EQ_STR (array[7], "");
>> -+ TEST_EQ_STR (array[8], "a");
>> -+ TEST_EQ_STR (array[9], "test");
>> -+ TEST_EQ_STR (array[10], "");
>> -+ TEST_EQ_STR (array[11], "");
>> -+ TEST_EQ_P (array[12], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -
>> - /* Check that we can split a string treating multiple consecutive
>> - * matching characters as a single separator to be skipped.
>> -@@ -645,6 +854,177 @@
>> - nih_free (array);
>> - }
>> -
>> -+ /* Check that we can split a string containing multiple
>> -+ * occurences of one of the delimiter characters at the
>> -+ * beginning of the string.
>> -+ */
>> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter characters at string start");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "\n\nhello", " \t\r\n", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
>> -+ for (i = 0; i < 1; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_P (array[1], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter characters at string start");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "\n\r hello", " \t\r\n", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
>> -+ for (i = 0; i < 1; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_P (array[1], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
>> -+ "characters within string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "hello\n\rworld", " \t\n\r", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
>> -+ for (i = 0; i < 2; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_STR (array[1], "world");
>> -+ TEST_EQ_P (array[2], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
>> -+ "characters within string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "hello\n\r\tworld", " \t\n\r", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
>> -+ for (i = 0; i < 2; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_STR (array[1], "world");
>> -+ TEST_EQ_P (array[2], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
>> -+ "characters at string end");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "hello\n\n\n\n\n\n\n", " \t\r\n", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
>> -+ for (i = 0; i < 1; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_P (array[1], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
>> -+ "characters at string end");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL, "hello \r\t\r\t\n ", " \t\r\n", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
>> -+ for (i = 0; i < 1; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_P (array[1], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
>> -+ "characters at beginning, middle and end of string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL,
>> -+ " hello\n\n\n, world\n\n\n",
>> -+ "\r\t\n ", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
>> -+ for (i = 0; i < 3; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_STR (array[1], ",");
>> -+ TEST_EQ_STR (array[2], "world");
>> -+ TEST_EQ_P (array[3], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -+
>> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
>> -+ "characters at beginning, middle and end of string");
>> -+ TEST_ALLOC_FAIL {
>> -+ array = nih_str_split (NULL,
>> -+ "\n \r\thello\n\n\r , \n\t\rworld\t \r\n \n",
>> -+ " \t\n\r", TRUE);
>> -+
>> -+ if (test_alloc_failed) {
>> -+ TEST_EQ_P (array, NULL);
>> -+ continue;
>> -+ }
>> -+
>> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
>> -+ for (i = 0; i < 3; i++)
>> -+ TEST_ALLOC_PARENT (array[i], array);
>> -+
>> -+ TEST_EQ_STR (array[0], "hello");
>> -+ TEST_EQ_STR (array[1], ",");
>> -+ TEST_EQ_STR (array[2], "world");
>> -+ TEST_EQ_P (array[3], NULL);
>> -+
>> -+ nih_free (array);
>> -+ }
>> -
>> - /* Check that we can give an empty string, and end up with a
>> - * one-element array that only contains a NULL pointer.
>> ---- libnih-1.0.3.orig/nih/tests/test_file.c
>> -+++ libnih-1.0.3/nih/tests/test_file.c
>> -@@ -724,6 +724,25 @@
>> - return FALSE;
>> - }
>> -
>> -+/* find only frodo files */
>> -+static int
>> -+my_filter_frodo_file (void *data,
>> -+ const char *path,
>> -+ int is_dir)
>> -+{
>> -+ char *slash;
>> -+
>> -+ if (is_dir)
>> -+ return FALSE;
>> -+
>> -+ slash = strrchr (path, '/');
>> -+ if (strcmp (slash, "/frodo"))
>> -+ return TRUE;
>> -+
>> -+ return FALSE;
>> -+}
>> -+
>> -+
>> - static int logger_called = 0;
>> -
>> - static int
>> -@@ -905,6 +924,48 @@
>> - TEST_EQ_STR (v->path, filename);
>> -
>> - nih_free (visited);
>> -+
>> -+ /* Try also inverse filter */
>> -+ TEST_ALLOC_SAFE {
>> -+ visitor_called = 0;
>> -+ visited = nih_list_new (NULL);
>> -+ }
>> -+
>> -+ ret = nih_dir_walk (dirname, my_filter_frodo_file,
>> -+ my_visitor, NULL, &ret);
>> -+
>> -+ TEST_EQ (ret, 0);
>> -+ TEST_EQ (visitor_called, 4);
>> -+
>> -+ v = (Visited *)visited->next;
>> -+ TEST_EQ (v->data, &ret);
>> -+ TEST_EQ_STR (v->dirname, dirname);
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/bar");
>> -+ TEST_EQ_STR (v->path, filename);
>> -+
>> -+ v = (Visited *)v->entry.next;
>> -+ TEST_EQ (v->data, &ret);
>> -+ TEST_EQ_STR (v->dirname, dirname);
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/bar/frodo");
>> -+ TEST_EQ_STR (v->path, filename);
>> -+
>> -+ v = (Visited *)v->entry.next;
>> -+ TEST_EQ (v->data, &ret);
>> -+ TEST_EQ_STR (v->dirname, dirname);
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/baz");
>> -+ TEST_EQ_STR (v->path, filename);
>> -+
>> -+ v = (Visited *)v->entry.next;
>> -+ TEST_EQ (v->data, &ret);
>> -+ TEST_EQ_STR (v->dirname, dirname);
>> -+ strcpy (filename, dirname);
>> -+ strcat (filename, "/frodo");
>> -+ TEST_EQ_STR (v->path, filename);
>> -+
>> -+ nih_free (visited);
>> - }
>> -
>> -
>> ---- libnih-1.0.3.orig/debian/control
>> -+++ libnih-1.0.3/debian/control
>> -@@ -0,0 +1,81 @@
>> -+Source: libnih
>> -+Section: libs
>> -+Priority: required
>> -+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
>> -+XSBC-Original-Maintainer: Scott James Remnant <scott@netsplit.com>
>> -+Standards-Version: 3.9.4
>> -+Build-Depends: debhelper (>= 9), pkg-config (>= 0.22), libdbus-1-dev (>= 1.4), libexpat1-dev (>= 2.0.0), dbus (>= 1.4), libc6-dev (>= 2.15~) | libc6.1-dev (>= 2.15~),
>> -+ dh-autoreconf, autopoint, dpkg-dev (>= 1.16.1~)
>> -+# To cross build this package also needs: libdbus-1-dev:native (>= 1.4), libexpat1-dev:native (>= 2.0.0)
>> -+# But :native build-deps are not supported yet, so instead one can do
>> -+# $ apt-get build-dep libnih
>> -+# $ apt-get build-dep libnih -aarmhf
>> -+# instead to get all required build-deps
>> -+Vcs-Bzr: lp:ubuntu/libnih
>> -+XSC-Debian-Vcs-Git: git://git.debian.org/git/collab-maint/libnih.git
>> -+XSC-Debian-Vcs-Browser: http://git.debian.org/?p=collab-maint/libnih.git;a=summary
>> -+Homepage: https://launchpad.net/libnih
>> -+
>> -+Package: libnih1
>> -+Architecture: any
>> -+Pre-Depends: ${misc:Pre-Depends}, ${shlibs:Depends}, ${misc:Depends}
>> -+Multi-Arch: same
>> -+Description: NIH Utility Library
>> -+ libnih is a light-weight "standard library" of C functions to ease the
>> -+ development of other libraries and applications, especially those
>> -+ normally found in /lib.
>> -+ .
>> -+ This package contains the shared library.
>> -+
>> -+Package: libnih-dev
>> -+Priority: optional
>> -+Section: libdevel
>> -+Architecture: any
>> -+Multi-Arch: same
>> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
>> -+Description: NIH Utility Library (development files)
>> -+ libnih is a light-weight "standard library" of C functions to ease the
>> -+ development of other libraries and applications, especially those
>> -+ normally found in /lib.
>> -+ .
>> -+ This package contains the static library and C header files which are
>> -+ needed for developing software using libnih.
>> -+
>> -+Package: libnih-dbus1
>> -+Architecture: any
>> -+Pre-Depends: ${misc:Pre-Depends}
>> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
>> -+Multi-Arch: same
>> -+Description: NIH D-Bus Bindings Library
>> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
>> -+ loop provided by libnih.
>> -+ .
>> -+ This package contains the shared library.
>> -+
>> -+Package: libnih-dbus-dev
>> -+Priority: optional
>> -+Section: libdevel
>> -+Architecture: any
>> -+Multi-Arch: same
>> -+Depends: libnih-dbus1 (= ${binary:Version}), libnih-dev (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
>> -+Recommends: nih-dbus-tool (= ${binary:Version})
>> -+Description: NIH D-Bus Bindings Library (development files)
>> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
>> -+ loop provided by libnih.
>> -+ .
>> -+ This package contains the static library and C header files which are
>> -+ needed for developing software using libnih-dbus.
>> -+
>> -+Package: nih-dbus-tool
>> -+Section: devel
>> -+Architecture: any
>> -+Multi-Arch: foreign
>> -+Depends: ${shlibs:Depends}, ${misc:Depends}
>> -+Recommends: libnih-dbus-dev (= ${binary:Version})
>> -+Description: NIH D-Bus Binding Tool
>> -+ nih-dbus-tool generates C source code from the D-Bus Introspection XML
>> -+ data provided by most services; either to make implementing the
>> -+ described objects in C programs or to make proxying to the described
>> -+ remote objects easier.
>> -+ .
>> -+ The generated code requires libnih-dbus-dev to be compiled.
>> ---- libnih-1.0.3.orig/debian/libnih-dev.install
>> -+++ libnih-1.0.3/debian/libnih-dev.install
>> -@@ -0,0 +1,6 @@
>> -+lib/*/libnih.a
>> -+lib/*/libnih.so
>> -+usr/include/libnih.h
>> -+usr/include/nih
>> -+usr/lib/*/pkgconfig/libnih.pc
>> -+usr/share/aclocal/libnih.m4
>> ---- libnih-1.0.3.orig/debian/libnih1.docs
>> -+++ libnih-1.0.3/debian/libnih1.docs
>> -@@ -0,0 +1,3 @@
>> -+AUTHORS
>> -+NEWS
>> -+README
>> ---- libnih-1.0.3.orig/debian/libnih-dbus1.install
>> -+++ libnih-1.0.3/debian/libnih-dbus1.install
>> -@@ -0,0 +1 @@
>> -+lib/*/libnih-dbus.so.*
>> ---- libnih-1.0.3.orig/debian/libnih1.install
>> -+++ libnih-1.0.3/debian/libnih1.install
>> -@@ -0,0 +1 @@
>> -+lib/*/libnih.so.*
>> ---- libnih-1.0.3.orig/debian/rules
>> -+++ libnih-1.0.3/debian/rules
>> -@@ -0,0 +1,54 @@
>> -+#!/usr/bin/make -f
>> -+
>> -+include /usr/share/dpkg/architecture.mk
>> -+
>> -+%:
>> -+ dh $@ --with autoreconf
>> -+
>> -+
>> -+CFLAGS := -Wall -fstack-protector -fPIE $(shell dpkg-buildflags --get CFLAGS)
>> -+LDFLAGS := -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -pie $(shell dpkg-buildflags --get LDFLAGS)
>> -+
>> -+override_dh_auto_configure:
>> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
>> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
>> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
>> -+else
>> -+ dh_auto_configure -B build-dbus-tool/ -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
>> -+ --libdir=/lib/$(DEB_BUILD_MULTIARCH) \
>> -+ --host=$(DEB_BUILD_GNU_TYPE)
>> -+ dh_auto_build -B build-dbus-tool/ --parallel
>> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
>> -+ NIH_DBUS_TOOL=$(CURDIR)/build-dbus-tool/nih-dbus-tool/nih-dbus-tool \
>> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
>> -+endif
>> -+
>> -+override_dh_auto_build:
>> -+ dh_auto_build --parallel
>> -+
>> -+override_dh_auto_test:
>> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
>> -+ dh_auto_test --parallel
>> -+endif
>> -+
>> -+override_dh_auto_install:
>> -+ dh_auto_install -- pkgconfigdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
>> -+
>> -+override_dh_makeshlibs:
>> -+ dh_makeshlibs -plibnih1 -V 'libnih1 (>= 1.0.0)'
>> -+ dh_makeshlibs -plibnih-dbus1 -V 'libnih-dbus1 (>= 1.0.0)'
>> -+ dh_makeshlibs -Nlibnih1 -Nlibnih-dbus1
>> -+
>> -+override_dh_shlibdeps:
>> -+ dh_shlibdeps
>> -+ sed -i 's/2\.14/2.15/' debian/*.substvars
>> -+ sed -i 's/>= 2.15)/>= 2.15~)/g' debian/*.substvars
>> -+
>> -+
>> -+# Symlink /usr/share/doc directories together
>> -+override_dh_installdocs:
>> -+ dh_installdocs --link-doc=libnih1
>> -+
>> -+override_dh_clean:
>> -+ rm -rf build-dbus-tool/
>> -+ dh_clean
>> ---- libnih-1.0.3.orig/debian/compat
>> -+++ libnih-1.0.3/debian/compat
>> -@@ -0,0 +1 @@
>> -+9
>> ---- libnih-1.0.3.orig/debian/nih-dbus-tool.install
>> -+++ libnih-1.0.3/debian/nih-dbus-tool.install
>> -@@ -0,0 +1,2 @@
>> -+usr/bin/nih-dbus-tool
>> -+usr/share/man/man1/nih-dbus-tool.1
>> ---- libnih-1.0.3.orig/debian/copyright
>> -+++ libnih-1.0.3/debian/copyright
>> -@@ -0,0 +1,18 @@
>> -+This is the Ubuntu package of libnih, the NIH Utility Library.
>> -+
>> -+Copyright © 2009 Canonical Ltd.
>> -+Copyright © 2009 Scott James Remnant <scott@netsplit.com>
>> -+
>> -+Licence:
>> -+
>> -+This program is free software; you can redistribute it and/or modify
>> -+it under the terms of the GNU General Public License version 2, as
>> -+published by the Free Software Foundation.
>> -+
>> -+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.
>> -+
>> -+On Ubuntu systems, the complete text of the GNU General Public License
>> -+can be found in ‘/usr/share/common-licenses/GPL-2’.
>> ---- libnih-1.0.3.orig/debian/libnih-dbus1.postinst
>> -+++ libnih-1.0.3/debian/libnih-dbus1.postinst
>> -@@ -0,0 +1,53 @@
>> -+#!/bin/sh
>> -+
>> -+set -e
>> -+
>> -+if [ "$1" = configure ]; then
>> -+ # A dependent library of Upstart has changed, so restart Upstart
>> -+ # such that it can safely unmount the root filesystem (LP: #740390)
>> -+
>> -+ # Query running version of Upstart, but only when we know
>> -+ # that initctl will work.
>> -+ #
>> -+ # The calculated version string may be the null string if
>> -+ # Upstart is not running (where for example an alternative
>> -+ # init is running outside a chroot environment) or if the
>> -+ # query failed for some reason. However, the version check
>> -+ # below handles a null version string correctly.
>> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
>> -+ awk '{print $3}'|tr -d ')' || :)
>> -+
>> -+ if ischroot; then
>> -+ # Do not honour re-exec when requested from within a
>> -+ # chroot since:
>> -+ #
>> -+ # (a) The version of Upstart outside might not support it.
>> -+ # (b) An isolated environment such as a chroot should
>> -+ # not be able to modify its containing environment.
>> -+ #
>> -+ # A sufficiently new Upstart will actually handle a re-exec
>> -+ # request coming from telinit within a chroot correctly (by
>> -+ # doing nothing) but it's simple enough to perform the check
>> -+ # here and save Upstart the effort.
>> -+ :
>> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
>> -+ # We are not running inside a chroot and the running version
>> -+ # of Upstart supports stateful re-exec, so we can
>> -+ # restart immediately.
>> -+ #
>> -+ # XXX: Note that the check on the running version must
>> -+ # remain *indefinitely* since it's the only safe way to
>> -+ # know if stateful re-exec is supported: simply checking
>> -+ # packaged version numbers is not sufficient since
>> -+ # the package could be upgraded multiple times without a
>> -+ # reboot.
>> -+ telinit u || :
>> -+ else
>> -+ # Before we shutdown or reboot, we need to re-exec so that we
>> -+ # can safely remount the root filesystem; we can't just do that
>> -+ # here because we lose state.
>> -+ touch /var/run/init.upgraded || :
>> -+ fi
>> -+fi
>> -+
>> -+#DEBHELPER#
>> ---- libnih-1.0.3.orig/debian/changelog.DEBIAN
>> -+++ libnih-1.0.3/debian/changelog.DEBIAN
>> -@@ -0,0 +1,118 @@
>> -+libnih (1.0.3-4) unstable; urgency=low
>> -+
>> -+ * Rebuild for new libc to update versioned dependency; this comes from
>> -+ the __abort_msg dependency, dpkg-shlibs needs overriding since this is
>> -+ actually a weak link, but this rebuild fixes things for now.
>> -+ Closes: #625257.
>> -+
>> -+ -- Scott James Remnant <scott@netsplit.com> Mon, 02 May 2011 15:08:33 -0700
>> -+
>> -+libnih (1.0.3-3) unstable; urgency=low
>> -+
>> -+ * New maintainer. Closes: #624442.
>> -+
>> -+ -- Scott James Remnant <scott@netsplit.com> Thu, 28 Apr 2011 14:26:05 -0700
>> -+
>> -+libnih (1.0.3-2) unstable; urgency=low
>> -+
>> -+ * Bump build dependency on libdbus-1-dev and dbus to (>= 1.4) for Unix file
>> -+ descriptor passing support.
>> -+
>> -+ -- Michael Biebl <biebl@debian.org> Thu, 10 Feb 2011 20:25:18 +0100
>> -+
>> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
>> -+
>> -+ * Rebuild with libc6-dev (>= 2.13~).
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
>> -+
>> -+libnih (1.0.3-1) unstable; urgency=low
>> -+
>> -+ * New upstream release.
>> -+ * Bump debhelper compatibility level to 8 and update build dependency
>> -+ accordingly.
>> -+
>> -+ -- Michael Biebl <biebl@debian.org> Mon, 07 Feb 2011 22:19:13 +0100
>> -+
>> -+libnih (1.0.2-2) unstable; urgency=low
>> -+
>> -+ * Install library development files to /usr/lib and not /lib.
>> -+ * Remove libtool *.la files as there are no reverse dependencies referencing
>> -+ them.
>> -+ * Bump Standards-Version to 3.9.1. No further changes.
>> -+
>> -+ -- Michael Biebl <biebl@debian.org> Sun, 02 Jan 2011 21:09:40 +0100
>> -+
>> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
>> -+
>> -+ * Disable some tests on ppc64 to build an initial package.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
>> -+
>> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
>> -+
>> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
>> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
>> -+
>> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
>> -+
>> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
>> -+
>> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
>> -+ __abort_msg is available with the same signature in eglibc 2.12.
>> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
>> -+
>> -+libnih (1.0.2-1) unstable; urgency=low
>> -+
>> -+ * Initial upload to Debian. Closes: #585071
>> -+ * Based on the Ubuntu package for Lucid done by Scott James Remnant with the
>> -+ following changes:
>> -+ - Switch packages to priority optional.
>> -+ - Use binary:Version instead of Source-Version.
>> -+ - Bump Standards-Version to 3.8.4.
>> -+ - Add Homepage and Vcs-* fields.
>> -+ - Don't symlink /usr/share/doc directories.
>> -+ - Refer to versioned /usr/share/common-licenses/GPL-2 file in
>> -+ debian/copyright.
>> -+ - List all symbols explicitly instead of using a wildcard and add symbols
>> -+ introduced in 1.0.1.
>> -+ - Use the symbols files to create the correct version info instead of
>> -+ specifying it manually via shlibs.
>> -+ - Switch to source format 3.0 (quilt).
>> -+ - Add watch file to track new upstream releases.
>> -+
>> -+ -- Michael Biebl <biebl@debian.org> Sun, 13 Jun 2010 23:36:52 +0200
>> -+
>> -+libnih (1.0.1-1) lucid; urgency=low
>> -+
>> -+ * New upstream release:
>> -+ - Add missing __nih_* symbols to linker version script so that we
>> -+ can link Upstart's test suite.
>> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
>> -+
>> -+libnih (1.0.0-2build1) lucid; urgency=low
>> -+
>> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
>> -+ __abort_msg is available with the same signature in eglibc 2.11.
>> -+ LP: #508702.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
>> -+
>> -+libnih (1.0.0-2) lucid; urgency=low
>> -+
>> -+ * debian/control: Add build-dependency on dbus so the test suite can
>> -+ pass on the buildds.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
>> -+
>> -+libnih (1.0.0-1) lucid; urgency=low
>> -+
>> -+ * First upstream release. Previously this code was included in the
>> -+ upstart, mountall and ureadahead source packages.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
>> -+
>> ---- libnih-1.0.3.orig/debian/libnih1.symbols
>> -+++ libnih-1.0.3/debian/libnih1.symbols
>> -@@ -0,0 +1,2 @@
>> -+libnih.so.1 libnih1 #MINVER#
>> -+ *@LIBNIH_1_0 1.0.0
>> ---- libnih-1.0.3.orig/debian/libnih-dbus-dev.install
>> -+++ libnih-1.0.3/debian/libnih-dbus-dev.install
>> -@@ -0,0 +1,5 @@
>> -+lib/*/libnih-dbus.a
>> -+lib/*/libnih-dbus.so
>> -+usr/include/libnih-dbus.h
>> -+usr/include/nih-dbus
>> -+usr/lib/*/pkgconfig/libnih-dbus.pc
>> ---- libnih-1.0.3.orig/debian/libnih1.postinst
>> -+++ libnih-1.0.3/debian/libnih1.postinst
>> -@@ -0,0 +1,53 @@
>> -+#!/bin/sh
>> -+
>> -+set -e
>> -+
>> -+if [ "$1" = configure ]; then
>> -+ # A dependent library of Upstart has changed, so restart Upstart
>> -+ # such that it can safely unmount the root filesystem (LP: #740390)
>> -+
>> -+ # Query running version of Upstart, but only when we know
>> -+ # that initctl will work.
>> -+ #
>> -+ # The calculated version string may be the null string if
>> -+ # Upstart is not running (where for example an alternative
>> -+ # init is running outside a chroot environment) or if the
>> -+ # query failed for some reason. However, the version check
>> -+ # below handles a null version string correctly.
>> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
>> -+ awk '{print $3}'|tr -d ')' || :)
>> -+
>> -+ if ischroot; then
>> -+ # Do not honour re-exec when requested from within a
>> -+ # chroot since:
>> -+ #
>> -+ # (a) The version of Upstart outside might not support it.
>> -+ # (b) An isolated environment such as a chroot should
>> -+ # not be able to modify its containing environment.
>> -+ #
>> -+ # A sufficiently new Upstart will actually handle a re-exec
>> -+ # request coming from telinit within a chroot correctly (by
>> -+ # doing nothing) but it's simple enough to perform the check
>> -+ # here and save Upstart the effort.
>> -+ :
>> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
>> -+ # We are not running inside a chroot and the running version
>> -+ # of Upstart supports stateful re-exec, so we can
>> -+ # restart immediately.
>> -+ #
>> -+ # XXX: Note that the check on the running version must
>> -+ # remain *indefinitely* since it's the only safe way to
>> -+ # know if stateful re-exec is supported: simply checking
>> -+ # packaged version numbers is not sufficient since
>> -+ # the package could be upgraded multiple times without a
>> -+ # reboot.
>> -+ telinit u || :
>> -+ else
>> -+ # Before we shutdown or reboot, we need to re-exec so that we
>> -+ # can safely remount the root filesystem; we can't just do that
>> -+ # here because we lose state.
>> -+ touch /var/run/init.upgraded || :
>> -+ fi
>> -+fi
>> -+
>> -+#DEBHELPER#
>> ---- libnih-1.0.3.orig/debian/libnih-dbus1.symbols
>> -+++ libnih-1.0.3/debian/libnih-dbus1.symbols
>> -@@ -0,0 +1,2 @@
>> -+libnih-dbus.so.1 libnih-dbus1 #MINVER#
>> -+ *@LIBNIH_DBUS_1_0 1.0.0
>> ---- libnih-1.0.3.orig/debian/changelog
>> -+++ libnih-1.0.3/debian/changelog
>> -@@ -0,0 +1,213 @@
>> -+libnih (1.0.3-4ubuntu16) raring; urgency=low
>> -+
>> -+ * debian/{libnih1.postinst,libnih-dbus1.postinst}: Force an upgrade to
>> -+ restart Upstart (to pick up new package version) if the running
>> -+ instance supports it.
>> -+ * Merge of important fixes from lp:~upstart-devel/libnih/nih
>> -+ (LP: #776532, LP: #777097, LP: #834813, LP: #1123588).
>> -+
>> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 14 Mar 2013 09:14:22 +0000
>> -+
>> -+libnih (1.0.3-4ubuntu15) raring; urgency=low
>> -+
>> -+ * Enable cross-building, sans adding :native build-dependencies.
>> -+ See comments in debian/control.
>> -+ * Lintian fixes.
>> -+
>> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 08 Jan 2013 15:38:58 +0000
>> -+
>> -+libnih (1.0.3-4ubuntu14) raring; urgency=low
>> -+
>> -+ * Update dbus code generator to allow for empty lists for type 'as'.
>> -+ This drops the != NULL check for NULL terminated arrays and moves the
>> -+ iteration loop inside an 'if' statement.
>> -+
>> -+ -- Stéphane Graber <stgraber@ubuntu.com> Thu, 13 Dec 2012 10:00:27 -0500
>> -+
>> -+libnih (1.0.3-4ubuntu13) raring; urgency=low
>> -+
>> -+ [ Petr Lautrbach <plautrba@redhat.com>, Dmitrijs Ledkovs ]
>> -+ * Fallback to lstat, if dirent.d_type is not available (not portable)
>> -+ (LP: #672643) (Closes: #695604)
>> -+
>> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 11 Dec 2012 17:26:52 +0000
>> -+
>> -+libnih (1.0.3-4ubuntu12) raring; urgency=low
>> -+
>> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the (e)glibc
>> -+ private symbol __abort_msg to avoid upgrade issues (LP: #997359).
>> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
>> -+
>> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 25 Oct 2012 10:57:30 +0100
>> -+
>> -+libnih (1.0.3-4ubuntu11) quantal; urgency=low
>> -+
>> -+ * Addition of debian/libnih-dbus1.postinst and
>> -+ debian/libnih1.postinst to force Upstart re-exec on shutdown
>> -+ to avoid unmounting disks uncleanly (LP: #740390).
>> -+
>> -+ -- James Hunt <james.hunt@ubuntu.com> Wed, 03 Oct 2012 16:49:40 +0100
>> -+
>> -+libnih (1.0.3-4ubuntu10) quantal; urgency=low
>> -+
>> -+ * Update config.guess,sub for aarch64
>> -+
>> -+ -- Wookey <wookey@wookware.org> Mon, 01 Oct 2012 12:57:05 +0100
>> -+
>> -+libnih (1.0.3-4ubuntu9) precise; urgency=low
>> -+
>> -+ * Mark the nih-dbus-tool package Multi-Arch: foreign so it can be used as
>> -+ a build-dependency of upstart when cross-building.
>> -+
>> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Wed, 15 Feb 2012 22:57:50 -0800
>> -+
>> -+libnih (1.0.3-4ubuntu8) precise; urgency=low
>> -+
>> -+ * libnih1 needs a versioned Pre-Depend on libc6 instead of just a Depend,
>> -+ because libc6 itself uses runlevel from the upstart package in its
>> -+ preinst, which in turn uses libnih1, which needs to be loadable (i.e.,
>> -+ its symbol references resolve). We therefore need to ensure that
>> -+ libnih1's dependencies are always unpacked before libnih1 itself is
>> -+ unpacked. While having something further up the stack (such as upstart,
>> -+ or something on top of upstart) being marked Essential: yes and with the
>> -+ necessary pre-depends would let apt handle this for us with its
>> -+ "immediate configuration" support, but for various reasons we don't want
>> -+ to make upstart essential. LP: #508083.
>> -+
>> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Fri, 10 Feb 2012 12:13:25 -0800
>> -+
>> -+libnih (1.0.3-4ubuntu7) precise; urgency=low
>> -+
>> -+ * Relax dependency on libc6.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 23:43:21 +0100
>> -+
>> -+libnih (1.0.3-4ubuntu6) precise; urgency=low
>> -+
>> -+ * Rebuild with libc6-dev (>= 2.15~).
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 21:48:57 +0100
>> -+
>> -+libnih (1.0.3-4ubuntu5) precise; urgency=low
>> -+
>> -+ * Mark libnih-dev and libnih-dbus-dev Multi-Arch: same as well.
>> -+
>> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Sun, 06 Nov 2011 14:45:07 -0800
>> -+
>> -+libnih (1.0.3-4ubuntu4) precise; urgency=low
>> -+
>> -+ * Make libnih1 and libnih-dbus1 installable using multi-arch.
>> -+
>> -+ -- James Hunt <james.hunt@ubuntu.com> Tue, 01 Nov 2011 14:25:09 -0400
>> -+
>> -+libnih (1.0.3-4ubuntu3) precise; urgency=low
>> -+
>> -+ * Build to install with eglibc-2.15.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 14 Oct 2011 14:05:03 +0200
>> -+
>> -+libnih (1.0.3-4ubuntu2) oneiric; urgency=low
>> -+
>> -+ * Use dpkg-buildflags to get the build flags.
>> -+ * Build with the default build flags, don't hard-code -Os. LP: #791315.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 15 Jun 2011 16:45:42 +0200
>> -+
>> -+libnih (1.0.3-4ubuntu1) oneiric; urgency=low
>> -+
>> -+ * Merge from debian unstable. Retained Ubuntu Build-Depends and Priority.
>> -+
>> -+ -- James Hunt <james.hunt@ubuntu.com> Mon, 23 May 2011 19:28:19 +0100
>> -+
>> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
>> -+
>> -+ * Rebuild with libc6-dev (>= 2.13~).
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
>> -+
>> -+libnih (1.0.3-1) natty; urgency=low
>> -+
>> -+ * New upstream release:
>> -+ - Added support for passing file descriptors over D-Bus to nih-dbus-tool
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 23 Dec 2010 22:28:24 +0000
>> -+
>> -+libnih (1.0.2-2) natty; urgency=low
>> -+
>> -+ * Revert the previous upload. It is never acceptable to simply disable
>> -+ tests, especially when it turns out that the test that was disabled
>> -+ was failing because there was a serious bug that could cause kernel
>> -+ panics for people on boot.
>> -+
>> -+ Test suites are here for a reason.
>> -+
>> -+ * Bumped libdbus Build-Dependency to the version with the bug fix that
>> -+ caused the test suite to fail.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Wed, 08 Dec 2010 19:40:15 +0000
>> -+
>> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
>> -+
>> -+ * Disable some tests on ppc64 to build an initial package.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
>> -+
>> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
>> -+
>> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
>> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
>> -+
>> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
>> -+
>> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
>> -+
>> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
>> -+ __abort_msg is available with the same signature in eglibc 2.12.
>> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
>> -+
>> -+libnih (1.0.2-1) maverick; urgency=low
>> -+
>> -+ * New upstream release:
>> -+ - Rename AC_COPYRIGHT to NIH_COPYRIGHT to avoid conflict with other
>> -+ packages.
>> -+ - Add serial to libnih.m4
>> -+ - Add NIH_WITH_LOCAL_LIBNIH macro.
>> -+
>> -+ * Fix use of ${Source-Version} to be ${binary:Version}
>> -+ * Add debian/source/format with "1.0" to be future compatible.
>> -+ * Bump standards version.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Tue, 27 Apr 2010 10:49:55 -0700
>> -+
>> -+libnih (1.0.1-1) lucid; urgency=low
>> -+
>> -+ * New upstream release:
>> -+ - Add missing __nih_* symbols to linker version script so that we
>> -+ can link Upstart's test suite.
>> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
>> -+
>> -+libnih (1.0.0-2build1) lucid; urgency=low
>> -+
>> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
>> -+ __abort_msg is available with the same signature in eglibc 2.11.
>> -+ LP: #508702.
>> -+
>> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
>> -+
>> -+libnih (1.0.0-2) lucid; urgency=low
>> -+
>> -+ * debian/control: Add build-dependency on dbus so the test suite can
>> -+ pass on the buildds.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
>> -+
>> -+libnih (1.0.0-1) lucid; urgency=low
>> -+
>> -+ * First upstream release. Previously this code was included in the
>> -+ upstart, mountall and ureadahead source packages.
>> -+
>> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
>> ---- libnih-1.0.3.orig/debian/source/format
>> -+++ libnih-1.0.3/debian/source/format
>> -@@ -0,0 +1 @@
>> -+1.0
>> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.h
>> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.h
>> -@@ -146,14 +146,14 @@
>> - const char *name, const char *path,
>> - NihDBusLostHandler lost_handler,
>> - void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
>> - const NihDBusInterface *interface,
>> - const char *name,
>> - NihDBusSignalHandler handler,
>> - void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus/dbus_object.h
>> -+++ libnih-1.0.3/nih-dbus/dbus_object.h
>> -@@ -61,8 +61,7 @@
>> - DBusConnection *connection,
>> - const char *path,
>> - const NihDBusInterface **interfaces,
>> -- void *data)
>> -- __attribute__ ((malloc));
>> -+ void *data);
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus/dbus_util.h
>> -+++ libnih-1.0.3/nih-dbus/dbus_util.h
>> -@@ -26,7 +26,7 @@
>> - NIH_BEGIN_EXTERN
>> -
>> - char *nih_dbus_path (const void *parent, const char *root, ...)
>> -- __attribute__ ((sentinel, warn_unused_result, malloc));
>> -+ __attribute__ ((sentinel, warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus/dbus_pending_data.h
>> -+++ libnih-1.0.3/nih-dbus/dbus_pending_data.h
>> -@@ -104,7 +104,7 @@
>> - NihDBusReplyHandler handler,
>> - NihDBusErrorHandler error_handler,
>> - void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.c
>> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.c
>> -@@ -46,11 +46,11 @@
>> - __attribute__ ((warn_unused_result));
>> - static char *nih_dbus_proxy_name_rule (const void *parent,
>> - NihDBusProxy *proxy)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static int nih_dbus_proxy_signal_destroy (NihDBusProxySignal *proxied);
>> - static char *nih_dbus_proxy_signal_rule (const void *parent,
>> - NihDBusProxySignal *proxied)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - /* Prototypes for handler functions */
>> - static DBusHandlerResult nih_dbus_proxy_name_owner_changed (DBusConnection *connection,
>> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.c
>> -+++ libnih-1.0.3/nih-dbus-tool/symbol.c
>> -@@ -40,10 +40,10 @@
>> - /* Prototypes for static functions */
>> - static char *symbol_strcat_interface (char **str, const void *parent,
>> - const char *format, ...)
>> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
>> - static char *symbol_strcat_title (char **str, const void *parent,
>> - const char *format, ...)
>> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
>> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
>> -
>> -
>> - /**
>> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.h
>> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.h
>> -@@ -37,7 +37,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.h
>> -+++ libnih-1.0.3/nih-dbus-tool/symbol.h
>> -@@ -28,22 +28,22 @@
>> - int symbol_valid (const char *symbol);
>> -
>> - char *symbol_from_name (const void *parent, const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char *symbol_impl (const void *parent, const char *prefix,
>> - const char *interface_name, const char *name,
>> - const char *postfix)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char *symbol_extern (const void *parent, const char *prefix,
>> - const char *interface_symbol, const char *midfix,
>> - const char *symbol, const char *postfix)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char *symbol_typedef (const void *parent, const char *prefix,
>> - const char *interface_symbol, const char *midfix,
>> - const char *symbol, const char *postfix)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/output.h
>> -+++ libnih-1.0.3/nih-dbus-tool/output.h
>> -@@ -35,9 +35,9 @@
>> - __attribute__ ((warn_unused_result));
>> -
>> - char *output_preamble (const void *parent, const char *path)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char *output_sentinel (const void *parent, const char *path)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/parse.h
>> -+++ libnih-1.0.3/nih-dbus-tool/parse.h
>> -@@ -95,7 +95,7 @@
>> -
>> - ParseStack *parse_stack_push (const void *parent, NihList *stack,
>> - ParseStackType type, void *data)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - ParseStack *parse_stack_top (NihList *stack);
>> -
>> - void parse_start_tag (XML_Parser xmlp, const char *tag,
>> -@@ -103,7 +103,7 @@
>> - void parse_end_tag (XML_Parser xmlp, const char *tag);
>> -
>> - Node * parse_xml (const void *parent, int fd, const char *filename)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/type.h
>> -+++ libnih-1.0.3/nih-dbus-tool/type.h
>> -@@ -94,43 +94,43 @@
>> -
>> - char * type_of (const void * parent,
>> - DBusSignatureIter *iter)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - TypeVar * type_var_new (const void *parent, const char *type,
>> - const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_var_to_string (const void *parent, TypeVar *var)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_var_layout (const void *parent, NihList *vars)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - TypeFunc * type_func_new (const void *parent, const char *type,
>> - const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_func_to_string (const void *parent, TypeFunc *func)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_func_to_typedef (const void *parent, TypeFunc *func)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_func_layout (const void *parent, NihList *funcs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - TypeStruct *type_struct_new (const void *parent, const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_struct_to_string (const void *parent, TypeStruct *structure)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * type_to_const (char **type, const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_to_pointer (char **type, const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_to_static (char **type, const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * type_to_extern (char **type, const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * type_strcat_assert (char **block, const void *parent,
>> - TypeVar *var, TypeVar *prev, TypeVar *next)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/argument.h
>> -+++ libnih-1.0.3/nih-dbus-tool/argument.h
>> -@@ -61,7 +61,7 @@
>> -
>> - Argument *argument_new (const void *parent, const char *name,
>> - const char *type, NihDBusArgDir direction)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int argument_start_tag (XML_Parser xmlp, const char *tag,
>> - char * const *attr)
>> ---- libnih-1.0.3.orig/nih-dbus-tool/indent.h
>> -+++ libnih-1.0.3/nih-dbus-tool/indent.h
>> -@@ -26,9 +26,9 @@
>> - NIH_BEGIN_EXTERN
>> -
>> - char *indent (char **str, const void *parent, int level)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char *comment (char **str, const void *parent)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/main.c
>> -+++ libnih-1.0.3/nih-dbus-tool/main.c
>> -@@ -52,10 +52,10 @@
>> - /* Prototypes for local functions */
>> - char *source_file_path (const void *parent, const char *output_path,
>> - const char *filename)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char *header_file_path (const void *parent, const char *output_path,
>> - const char *filename)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - /**
>> ---- libnih-1.0.3.orig/nih-dbus-tool/signal.h
>> -+++ libnih-1.0.3/nih-dbus-tool/signal.h
>> -@@ -58,7 +58,7 @@
>> - int signal_name_valid (const char *name);
>> -
>> - Signal * signal_new (const void *parent, const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int signal_start_tag (XML_Parser xmlp, const char *tag,
>> - char * const *attr)
>> -@@ -76,18 +76,18 @@
>> - char * signal_object_function (const void *parent, const char *prefix,
>> - Interface *interface, Signal *signal,
>> - NihList *prototypes, NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * signal_proxy_function (const void *parent, const char *prefix,
>> - Interface *interface, Signal *signal,
>> - NihList *prototypes, NihList *typedefs,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * signal_args_array (const void *parent, const char *prefix,
>> - Interface *interface, Signal *signal,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
>> -+++ libnih-1.0.3/nih-dbus-tool/marshal.c
>> -@@ -49,7 +49,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static char *marshal_array (const void *parent,
>> - DBusSignatureIter *iter,
>> - const char *iter_name, const char *name,
>> -@@ -58,7 +58,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static char *marshal_struct (const void *parent,
>> - DBusSignatureIter *iter,
>> - const char *iter_name, const char *name,
>> -@@ -67,7 +67,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - /**
>> -@@ -364,6 +364,7 @@
>> - nih_local TypeVar *element_len_var = NULL;
>> - nih_local char * block = NULL;
>> - nih_local char * vars_block = NULL;
>> -+ nih_local char * loop_block = NULL;
>> -
>> - nih_assert (iter != NULL);
>> - nih_assert (iter_name != NULL);
>> -@@ -448,7 +449,7 @@
>> - nih_list_add (locals, &array_iter_var->entry);
>> -
>> - if (dbus_type_is_fixed (element_type)) {
>> -- if (! nih_strcat_sprintf (&code, parent,
>> -+ if (! nih_strcat_sprintf (&loop_block, parent,
>> - "for (size_t %s = 0; %s < %s; %s++) {\n",
>> - loop_name, loop_name, len_name, loop_name)) {
>> - nih_free (code);
>> -@@ -456,6 +457,12 @@
>> - }
>> - } else {
>> - if (! nih_strcat_sprintf (&code, parent,
>> -+ "if (%s) {\n",
>> -+ name)) {
>> -+ nih_free (code);
>> -+ return NULL;
>> -+ }
>> -+ if (! nih_strcat_sprintf (&loop_block, parent,
>> - "for (size_t %s = 0; %s[%s]; %s++) {\n",
>> - loop_name, name, loop_name, loop_name)) {
>> - nih_free (code);
>> -@@ -576,7 +583,7 @@
>> - }
>> -
>> -
>> -- if (! nih_strcat_sprintf (&code, parent,
>> -+ if (! nih_strcat_sprintf (&loop_block, parent,
>> - "%s"
>> - "\n"
>> - "%s"
>> -@@ -590,9 +597,34 @@
>> - }
>> -
>> - /* Close the container again */
>> -+ if (! nih_strcat_sprintf (&loop_block, parent,
>> -+ "}\n")) {
>> -+ nih_free (code);
>> -+ return NULL;
>> -+ }
>> -+
>> -+ if (dbus_type_is_fixed (element_type)) {
>> -+ if (! nih_strcat_sprintf (&code, parent,
>> -+ "%s\n", loop_block)) {
>> -+ nih_free (code);
>> -+ return NULL;
>> -+ }
>> -+ }
>> -+ else {
>> -+ if (! indent (&loop_block, NULL, 1)) {
>> -+ nih_free (code);
>> -+ return NULL;
>> -+ }
>> -+
>> -+ if (! nih_strcat_sprintf (&code, parent,
>> -+ "%s"
>> -+ "}\n\n", loop_block)) {
>> -+ nih_free (code);
>> -+ return NULL;
>> -+ }
>> -+ }
>> -+
>> - if (! nih_strcat_sprintf (&code, parent,
>> -- "}\n"
>> -- "\n"
>> - "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
>> - "%s"
>> - "}\n",
>> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.c
>> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.c
>> -@@ -51,7 +51,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static char *demarshal_array (const void *parent,
>> - DBusSignatureIter *iter,
>> - const char *parent_name,
>> -@@ -62,7 +62,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - static char *demarshal_struct (const void *parent,
>> - DBusSignatureIter *iter,
>> - const char *parent_name,
>> -@@ -73,7 +73,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - /**
>> ---- libnih-1.0.3.orig/nih-dbus-tool/interface.h
>> -+++ libnih-1.0.3/nih-dbus-tool/interface.h
>> -@@ -61,7 +61,7 @@
>> -
>> - Interface *interface_new (const void *parent,
>> - const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int interface_start_tag (XML_Parser xmlp,
>> - const char *tag,
>> -@@ -81,26 +81,26 @@
>> - Interface *interface,
>> - int with_handlers,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * interface_signals_array (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> - int with_filters,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * interface_properties_array (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> - int with_handlers,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * interface_struct (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> - int object,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> -
>> - char * interface_proxy_get_all_function (const void *parent,
>> -@@ -108,7 +108,7 @@
>> - Interface *interface,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * interface_proxy_get_all_notify_function (const void *parent,
>> - const char *prefix,
>> -@@ -116,14 +116,14 @@
>> - NihList *prototypes,
>> - NihList *typedefs,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * interface_proxy_get_all_sync_function (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/method.h
>> -+++ libnih-1.0.3/nih-dbus-tool/method.h
>> -@@ -62,7 +62,7 @@
>> - int method_name_valid (const char *name);
>> -
>> - Method * method_new (const void *parent, const char *name)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int method_start_tag (XML_Parser xmlp, const char *tag,
>> - char * const *attr)
>> -@@ -82,33 +82,33 @@
>> - Interface *interface, Method *method,
>> - NihList *prototypes, NihList *handlers,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * method_reply_function (const void *parent, const char *prefix,
>> - Interface *interface, Method *method,
>> - NihList *prototypes, NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * method_proxy_function (const void *parent, const char *prefix,
>> - Interface *interface, Method *method,
>> - NihList *prototypes, NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * method_proxy_notify_function (const void *parent, const char *prefix,
>> - Interface *interface, Method *method,
>> - NihList *prototypes, NihList *typedefs,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * method_proxy_sync_function (const void *parent, const char *prefix,
>> - Interface *interface, Method *method,
>> - NihList *prototypes, NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * method_args_array (const void *parent, const char *prefix,
>> - Interface *interface, Method *method,
>> - NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/node.h
>> -+++ libnih-1.0.3/nih-dbus-tool/node.h
>> -@@ -47,7 +47,7 @@
>> - int node_path_valid (const char *name);
>> -
>> - Node * node_new (const void *parent, const char *path)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int node_start_tag (XML_Parser xmlp, const char *tag,
>> - char * const *attr)
>> -@@ -59,18 +59,18 @@
>> -
>> - char * node_interfaces_array (const void *parent, const char *prefix,
>> - Node *node, int object, NihList *prototypes)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * node_object_functions (const void *parent, const char *prefix,
>> - Node *node,
>> - NihList *prototypes, NihList *handlers,
>> - NihList *structs, NihList *externs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * node_proxy_functions (const void *parent, const char *prefix,
>> - Node *node,
>> - NihList *prototypes, NihList *structs,
>> - NihList *typedefs, NihList *externs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.h
>> -+++ libnih-1.0.3/nih-dbus-tool/marshal.h
>> -@@ -35,7 +35,7 @@
>> - const char *prefix, const char *interface_symbol,
>> - const char *member_symbol, const char *symbol,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/type.c
>> -+++ libnih-1.0.3/nih-dbus-tool/type.c
>> -@@ -1101,7 +1101,7 @@
>> - nih_assert (block != NULL);
>> - nih_assert (var != NULL);
>> -
>> -- if (! strchr (var->type, '*'))
>> -+ if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
>> - return *block;
>> -
>> - if (next && (! strcmp (next->type, "size_t"))) {
>> ---- libnih-1.0.3.orig/nih-dbus-tool/property.h
>> -+++ libnih-1.0.3/nih-dbus-tool/property.h
>> -@@ -65,7 +65,7 @@
>> - const char *name,
>> - const char *type,
>> - NihDBusAccess access)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - int property_start_tag (XML_Parser xmlp, const char *tag,
>> - char * const *attr)
>> -@@ -88,7 +88,7 @@
>> - NihList *prototypes,
>> - NihList *handlers,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * property_object_set_function (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> -@@ -96,7 +96,7 @@
>> - NihList *prototypes,
>> - NihList *handlers,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * property_proxy_get_function (const void *parent,
>> - const char *prefix,
>> -@@ -104,7 +104,7 @@
>> - Property *property,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * property_proxy_get_notify_function (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> -@@ -112,7 +112,7 @@
>> - NihList *prototypes,
>> - NihList *typedefs,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * property_proxy_set_function (const void *parent,
>> - const char *prefix,
>> -@@ -120,7 +120,7 @@
>> - Property *property,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * property_proxy_set_notify_function (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> -@@ -128,7 +128,7 @@
>> - NihList *prototypes,
>> - NihList *typedefs,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - char * property_proxy_get_sync_function (const void *parent,
>> - const char *prefix,
>> -@@ -136,14 +136,14 @@
>> - Property *property,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - char * property_proxy_set_sync_function (const void *parent,
>> - const char *prefix,
>> - Interface *interface,
>> - Property *property,
>> - NihList *prototypes,
>> - NihList *structs)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - NIH_END_EXTERN
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_main.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_main.c
>> -@@ -100,10 +100,10 @@
>> -
>> - extern char *source_file_path (const void *parent, const char *output_path,
>> - const char *filename)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> - extern char *header_file_path (const void *parent, const char *output_path,
>> - const char *filename)
>> -- __attribute__ ((warn_unused_result, malloc));
>> -+ __attribute__ ((warn_unused_result));
>> -
>> - void
>> - test_source_file_path (void)
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
>> -@@ -12524,6 +12524,7 @@
>> - dbus_message_iter_init (reply, &iter);
>> -
>> - dbus_message_iter_get_basic (&iter, &str_value);
>> -+ TEST_NE (str_value[0], '\0');
>> - TEST_TRUE (strchr ("0123456789", str_value[0]));
>> -
>> - dbus_message_unref (reply);
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
>> -@@ -1479,39 +1479,41 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -- "\tDBusMessageIter value_element_iter;\n"
>> -- "\tconst int16_t * value_element;\n"
>> -- "\tsize_t value_element_len;\n"
>> -+ "if (value) {\n"
>> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -+ "\t\tDBusMessageIter value_element_iter;\n"
>> -+ "\t\tconst int16_t * value_element;\n"
>> -+ "\t\tsize_t value_element_len;\n"
>> - "\n"
>> -- "\tvalue_element = value[value_i];\n"
>> -- "\tvalue_element_len = value_len[value_i];\n"
>> -+ "\t\tvalue_element = value[value_i];\n"
>> -+ "\t\tvalue_element_len = value_len[value_i];\n"
>> - "\n"
>> -
>> -- "\t/* Marshal an array onto the message */\n"
>> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal an array onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
>> -- "\t\tint16_t value_element_element;\n"
>> -+ "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
>> -+ "\t\t\tint16_t value_element_element;\n"
>> - "\n"
>> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
>> -+ "\t\t\tvalue_element_element = value_element[value_element_i];\n"
>> - "\n"
>> -- "\t\t/* Marshal a int16_t onto the message */\n"
>> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
>> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\t/* Marshal a int16_t onto the message */\n"
>> -+ "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
>> -+ "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\t\treturn -1;\n"
>> -+ "\t\t\t}\n"
>> -+ "\t\t}\n"
>> -+ "\n"
>> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> - "\t\t\treturn -1;\n"
>> - "\t\t}\n"
>> -- "\t}\n"
>> -- "\n"
>> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -
>> -+ "\t}\n"
>> - "}\n"
>> - "\n"
>> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
>> -@@ -1766,15 +1768,17 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -- "\tconst char *value_element;\n"
>> -+ "if (value) {\n"
>> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -+ "\t\tconst char *value_element;\n"
>> - "\n"
>> -- "\tvalue_element = value[value_i];\n"
>> -+ "\t\tvalue_element = value[value_i];\n"
>> - "\n"
>> -- "\t/* Marshal a char * onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -+ "\t\t/* Marshal a char * onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\t}\n"
>> - "}\n"
>> - "\n"
>> -@@ -1933,35 +1937,39 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -- "\tDBusMessageIter value_element_iter;\n"
>> -- "\tchar * const * value_element;\n"
>> -+ "if (value) {\n"
>> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -+ "\t\tDBusMessageIter value_element_iter;\n"
>> -+ "\t\tchar * const * value_element;\n"
>> - "\n"
>> -- "\tvalue_element = value[value_i];\n"
>> -+ "\t\tvalue_element = value[value_i];\n"
>> - "\n"
>> -- "\t/* Marshal an array onto the message */\n"
>> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -- "\n"
>> -- "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
>> -- "\t\tconst char *value_element_element;\n"
>> -+ "\t\t/* Marshal an array onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
>> -+ "\t\tif (value_element) {\n"
>> -+ "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
>> -+ "\t\t\t\tconst char *value_element_element;\n"
>> -+ "\n"
>> -+ "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
>> -+ "\n"
>> -+ "\t\t\t\t/* Marshal a char * onto the message */\n"
>> -+ "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
>> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\t\t\treturn -1;\n"
>> -+ "\t\t\t\t}\n"
>> -+ "\t\t\t}\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\t\t/* Marshal a char * onto the message */\n"
>> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
>> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> - "\t\t\treturn -1;\n"
>> - "\t\t}\n"
>> - "\t}\n"
>> -- "\n"
>> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> - "}\n"
>> - "\n"
>> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
>> -@@ -2194,16 +2202,18 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
>> -- "\tconst char *value_item2_element;\n"
>> -+ "if (value_item2) {\n"
>> -+ "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
>> -+ "\t\tconst char *value_item2_element;\n"
>> - "\n"
>> -- "\tvalue_item2_element = value_item2[value_item2_i];\n"
>> -+ "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
>> - "\n"
>> -- "\t/* Marshal a char * onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -+ "\t\t/* Marshal a char * onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\t}\n"
>> - "}\n"
>> - "\n"
>> -@@ -2642,41 +2652,43 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -- "\tDBusMessageIter value_element_iter;\n"
>> -- "\tconst char * value_element_item0;\n"
>> -- "\tuint32_t value_element_item1;\n"
>> -- "\tconst MyStructArrayValueElement *value_element;\n"
>> -+ "if (value) {\n"
>> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -+ "\t\tDBusMessageIter value_element_iter;\n"
>> -+ "\t\tconst char * value_element_item0;\n"
>> -+ "\t\tuint32_t value_element_item1;\n"
>> -+ "\t\tconst MyStructArrayValueElement *value_element;\n"
>> - "\n"
>> -- "\tvalue_element = value[value_i];\n"
>> -+ "\t\tvalue_element = value[value_i];\n"
>> - "\n"
>> -- "\t/* Marshal a structure onto the message */\n"
>> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a structure onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tvalue_element_item0 = value_element->item0;\n"
>> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
>> - "\n"
>> -- "\t/* Marshal a char * onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a char * onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tvalue_element_item1 = value_element->item1;\n"
>> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
>> - "\n"
>> -- "\t/* Marshal a uint32_t onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\t}\n"
>> - "}\n"
>> - "\n"
>> -@@ -2912,41 +2924,43 @@
>> - "\treturn -1;\n"
>> - "}\n"
>> - "\n"
>> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -- "\tDBusMessageIter value_element_iter;\n"
>> -- "\tconst char * value_element_item0;\n"
>> -- "\tuint32_t value_element_item1;\n"
>> -- "\tconst MyDictEntryArrayValueElement *value_element;\n"
>> -+ "if (value) {\n"
>> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
>> -+ "\t\tDBusMessageIter value_element_iter;\n"
>> -+ "\t\tconst char * value_element_item0;\n"
>> -+ "\t\tuint32_t value_element_item1;\n"
>> -+ "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
>> - "\n"
>> -- "\tvalue_element = value[value_i];\n"
>> -+ "\t\tvalue_element = value[value_i];\n"
>> - "\n"
>> -- "\t/* Marshal a structure onto the message */\n"
>> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a structure onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tvalue_element_item0 = value_element->item0;\n"
>> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
>> - "\n"
>> -- "\t/* Marshal a char * onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a char * onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tvalue_element_item1 = value_element->item1;\n"
>> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
>> - "\n"
>> -- "\t/* Marshal a uint32_t onto the message */\n"
>> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -- "\t}\n"
>> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
>> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\n"
>> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -- "\t\treturn -1;\n"
>> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
>> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
>> -+ "\t\t\treturn -1;\n"
>> -+ "\t\t}\n"
>> - "\t}\n"
>> - "}\n"
>> - "\n"
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
>> -@@ -27359,6 +27359,7 @@
>> - TEST_TRUE (unix_fd_to_str_replied);
>> -
>> - TEST_EQ_P (last_data, parent);
>> -+ TEST_NE (last_str_value[0], '\0');
>> - TEST_TRUE (strchr ("0123456789", last_str_value[0]));
>> - TEST_ALLOC_PARENT (last_str_value, parent);
>> -
>> -@@ -27673,6 +27674,7 @@
>> -
>> - TEST_EQ (ret, 0);
>> -
>> -+ TEST_NE (str_value[0], '\0');
>> - TEST_TRUE (strchr ("0123456789", str_value[0]));
>> - TEST_ALLOC_PARENT (str_value, parent);
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_property.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_property.c
>> -@@ -8733,7 +8733,7 @@
>> - TypeVar * var;
>> - NihListEntry * attrib;
>> - NihDBusProxy * proxy = NULL;
>> -- void * parent = NULL;
>> -+ void * parent __attribute__((unused)) = NULL;
>> - pid_t pid = -1;
>> - int status;
>> - DBusMessage * method_call;
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
>> -@@ -136,17 +136,19 @@
>> - goto enomem;
>> - }
>> -
>> -- for (size_t output_i = 0; output[output_i]; output_i++) {
>> -- const char *output_element;
>> -+ if (output) {
>> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
>> -+ const char *output_element;
>> -
>> -- output_element = output[output_i];
>> -+ output_element = output[output_i];
>> -
>> -- /* Marshal a char * onto the message */
>> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -- dbus_message_iter_abandon_container (&iter, &output_iter);
>> -- dbus_message_unref (reply);
>> -- reply = NULL;
>> -- goto enomem;
>> -+ /* Marshal a char * onto the message */
>> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
>> -+ dbus_message_unref (reply);
>> -+ reply = NULL;
>> -+ goto enomem;
>> -+ }
>> - }
>> - }
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
>> -@@ -7,7 +7,6 @@
>> - DBusMessageIter output_iter;
>> -
>> - nih_assert (message != NULL);
>> -- nih_assert (output != NULL);
>> -
>> - /* If the sender doesn't care about a reply, don't bother wasting
>> - * effort constructing and sending one.
>> -@@ -28,16 +27,18 @@
>> - return -1;
>> - }
>> -
>> -- for (size_t output_i = 0; output[output_i]; output_i++) {
>> -- const char *output_element;
>> --
>> -- output_element = output[output_i];
>> --
>> -- /* Marshal a char * onto the message */
>> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -- dbus_message_iter_abandon_container (&iter, &output_iter);
>> -- dbus_message_unref (reply);
>> -- return -1;
>> -+ if (output) {
>> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
>> -+ const char *output_element;
>> -+
>> -+ output_element = output[output_i];
>> -+
>> -+ /* Marshal a char * onto the message */
>> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
>> -+ dbus_message_unref (reply);
>> -+ return -1;
>> -+ }
>> - }
>> - }
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
>> -@@ -7,7 +7,6 @@
>> - DBusMessageIter output_iter;
>> -
>> - nih_assert (message != NULL);
>> -- nih_assert (output != NULL);
>> -
>> - /* If the sender doesn't care about a reply, don't bother wasting
>> - * effort constructing and sending one.
>> -@@ -28,16 +27,18 @@
>> - return -1;
>> - }
>> -
>> -- for (size_t output_i = 0; output[output_i]; output_i++) {
>> -- const char *output_element;
>> --
>> -- output_element = output[output_i];
>> --
>> -- /* Marshal a char * onto the message */
>> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -- dbus_message_iter_abandon_container (&iter, &output_iter);
>> -- dbus_message_unref (reply);
>> -- return -1;
>> -+ if (output) {
>> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
>> -+ const char *output_element;
>> -+
>> -+ output_element = output[output_i];
>> -+
>> -+ /* Marshal a char * onto the message */
>> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
>> -+ dbus_message_unref (reply);
>> -+ return -1;
>> -+ }
>> - }
>> - }
>> -
>> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
>> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
>> -@@ -88,17 +88,19 @@
>> - goto enomem;
>> - }
>> -
>> -- for (size_t output_i = 0; output[output_i]; output_i++) {
>> -- const char *output_element;
>> -+ if (output) {
>> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
>> -+ const char *output_element;
>> -
>> -- output_element = output[output_i];
>> -+ output_element = output[output_i];
>> -
>> -- /* Marshal a char * onto the message */
>> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -- dbus_message_iter_abandon_container (&iter, &output_iter);
>> -- dbus_message_unref (reply);
>> -- reply = NULL;
>> -- goto enomem;
>> -+ /* Marshal a char * onto the message */
>> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
>> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
>> -+ dbus_message_unref (reply);
>> -+ reply = NULL;
>> -+ goto enomem;
>> -+ }
>> - }
>> - }
>> -
>> diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
>> deleted file mode 100644
>> index ff7a4ed10..000000000
>> --- a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
>> +++ /dev/null
>> @@ -1,48 +0,0 @@
>> -# Copyright (c) 2013 LG Electronics, Inc.
>> -
>> -SUMMARY = "libnih library"
>> -HOMEPAGE = "https://launchpad.net/libnih"
>> -DESCRIPTION = "libnih is a small library for C application development \
>> - containing functions that, despite its name, are not implemented \
>> - elsewhere in the standard library set. \
>> - \
>> - libnih is roughly equivalent to other C libraries such as glib, \
>> - except that its focus is on a small size and intended for \
>> - applications that sit very low in the software stack, especially \
>> - outside of /usr. \
>> - \
>> - It expressly does not reimplement functions that already exist in \
>> - libraries ordinarily shipped in /lib such libc6, and does not do \
>> - foolish things like invent arbitrary typedefs for perfectly good C types."
>> -
>> -SECTION = "libs"
>> -
>> -LICENSE = "GPL-2.0"
>> -LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
>> -
>> -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 gettext
>> -
>> -do_configure_append () {
>> - sed -i -e 's,lib/pkgconfig,${baselib}/pkgconfig,g' ${S}/nih/Makefile.in ${S}/nih-dbus/Makefile.in
>> -}
>> -
>> -FILES_${PN}-dev += "${libdir}/pkgconfig/* \
>> - ${includedir}/* \
>> - ${libdir}/*.so \
>> - ${datadir}/* \
>> - "
>> -
>> -# target libnih requires native nih-dbus-tool
>> -BBCLASSEXTEND = "native"
>> --
>> 2.17.1
>>
>> --
>> _______________________________________________
>> Openembedded-devel mailing list
>> Openembedded-devel@lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe][PATCH] libnih: Remove
2020-01-09 21:51 ` akuster808
@ 2020-01-09 22:09 ` Khem Raj
0 siblings, 0 replies; 5+ messages in thread
From: Khem Raj @ 2020-01-09 22:09 UTC (permalink / raw)
To: akuster808; +Cc: openembeded-devel, Adrian Bunk
On Thu, Jan 9, 2020 at 1:51 PM akuster808 <akuster808@gmail.com> wrote:
>
>
>
> On 1/9/20 1:49 PM, Khem Raj wrote:
> > thanks Adrian, I wonder how many such recipes are we carrying it would
> > be helpful to retire them
>
> I suspect all the netkit ones should go.
>
I agree. seems you will send a patch
> - armin
> >
> > On Thu, Jan 9, 2020 at 12:33 PM Adrian Bunk <bunk@stusta.de> wrote:
> >> The main user was upstart, which is no longer provided
> >> by any maintained layer.
> >>
> >> Signed-off-by: Adrian Bunk <bunk@stusta.de>
> >> ---
> >> .../packagegroups/packagegroup-meta-oe.bb | 2 +-
> >> ...files-also-make-it-work-with-latest-.patch | 24310 ----------------
> >> ...and-SIGCHILD-are-same-on-sytem-V-sys.patch | 28 -
> >> .../libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch | 3593 ---
> >> .../recipes-support/libnih/libnih_1.0.3.bb | 48 -
> >> 5 files changed, 1 insertion(+), 27980 deletions(-)
> >> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
> >> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> >> delete mode 100644 meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> >> delete mode 100644 meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> >>
> >> diff --git a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> >> index 31c3f4e95..ad968ddf9 100644
> >> --- a/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> >> +++ b/meta-oe/recipes-core/packagegroups/packagegroup-meta-oe.bb
> >> @@ -236,7 +236,7 @@ RDEPENDS_packagegroup-meta-oe-support ="\
> >> libinih inotify-tools joe lcms lcov libatasmart libbytesize \
> >> libcereal libcyusbserial libee libeigen libestr libftdi libgit2 \
> >> libgpiod libiio libjs-jquery libjs-sizzle liblinebreak libmicrohttpd \
> >> - libmxml libnih liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
> >> + libmxml liboauth libol liboop libp11 libraw1394 libsmi libsoc libssh2 \
> >> libssh libtar libteam libtinyxml2 libtinyxml libusbg libusb-compat libutempter \
> >> links lio-utils lockdev log4c log4cpp logwarn libdevmapper lvm2 \
> >> mailcap mbuffer mg minini \
> >> 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
> >> deleted file mode 100644
> >> index 2c857c26f..000000000
> >> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-Update-autotool-files-also-make-it-work-with-latest-.patch
> >> +++ /dev/null
> >> @@ -1,24310 +0,0 @@
> >> -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/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> >> deleted file mode 100644
> >> index a43b4b176..000000000
> >> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/0001-signal.c-SIGCLD-and-SIGCHILD-are-same-on-sytem-V-sys.patch
> >> +++ /dev/null
> >> @@ -1,28 +0,0 @@
> >> -From f1b9992caf9910f9f7afae401045e42572cc84ff Mon Sep 17 00:00:00 2001
> >> -From: Khem Raj <raj.khem@gmail.com>
> >> -Date: Sat, 1 Apr 2017 08:50:35 -0700
> >> -Subject: [PATCH] signal.c: SIGCLD and SIGCHILD are same on sytem V systems
> >> -
> >> -Musl drops the SIGCLD legacy
> >> -
> >> -Signed-off-by: Khem Raj <raj.khem@gmail.com>
> >> ----
> >> - nih/signal.c | 2 +-
> >> - 1 file changed, 1 insertion(+), 1 deletion(-)
> >> -
> >> -diff --git a/nih/signal.c b/nih/signal.c
> >> -index a241df9..691c8e6 100644
> >> ---- a/nih/signal.c
> >> -+++ b/nih/signal.c
> >> -@@ -87,7 +87,7 @@ static const SignalName signal_names[] = {
> >> - { SIGSTKFLT, "STKFLT" },
> >> - #endif
> >> - { SIGCHLD, "CHLD" },
> >> -- { SIGCLD, "CLD" },
> >> -+ { SIGCHLD, "CLD" },
> >> - { SIGCONT, "CONT" },
> >> - { SIGSTOP, "STOP" },
> >> - { SIGTSTP, "TSTP" },
> >> ---
> >> -2.12.1
> >> -
> >> diff --git a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch b/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> >> deleted file mode 100644
> >> index 5d125c851..000000000
> >> --- a/meta-oe/recipes-support/libnih/libnih-1.0.3/libnih_1.0.3-4ubuntu16.patch
> >> +++ /dev/null
> >> @@ -1,3593 +0,0 @@
> >> ---- libnih-1.0.3.orig/ChangeLog
> >> -+++ libnih-1.0.3/ChangeLog
> >> -@@ -1,3 +1,84 @@
> >> -+2013-03-13 Steve Langasek <steve.langasek@ubuntu.com>
> >> -+
> >> -+ * nih/watch.c (nih_watch_walk_filter): New NihFileFilter function
> >> -+ passed to nih_dir_walk_scan() to ensure the nih_watch_new() filter
> >> -+ function is passed the NihWatch data rather than the data passed to
> >> -+ the nih_dir_walk() NihFileVisitor function (LP: #776532).
> >> -+
> >> -+ * nih/tests/test_watch.c (test_new): New test "with filter and data"
> >> -+ to ensure filter is passed correct value.
> >> -+
> >> -+2013-02-28 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * Removal of gcc 'malloc' function attribute resulting from
> >> -+ a clarification in its description which makes its use invalid.
> >> -+ (LP: #1123588).
> >> -+
> >> -+2013-02-05 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * nih/logging.c: nih_log_abort_message(): Remove erroneous check
> >> -+ left over from use of __abort_msg weak symbol.
> >> -+ * nih/tests/test_logging.c: Remove unecessary check on whether
> >> -+ __nih_abort_msg has an address.
> >> -+
> >> -+2012-12-13 Stéphane Graber <stgraber@ubuntu.com>
> >> -+
> >> -+ * nih-dbus-tool/type.c, nih-dbus-tool/marshal.c: Update dbus code
> >> -+ generator to allow for empty lists for type 'as'. This drops the
> >> -+ != NULL check for NULL terminated arrays and moves the iteration
> >> -+ loop inside an 'if' statement.
> >> -+
> >> -+2012-12-11 Dmitrijs Ledkovs <dmitrijs.ledkovs@canonical.com>
> >> -+
> >> -+ * nih/file.c (nih_dir_walk_scan): Fallback to lstat, if the
> >> -+ non-portable dirent.d_type is not available (LP: #672643) (Closes:
> >> -+ #695604).
> >> -+
> >> -+2012-12-10 Petr Lautrbach <plautrba@redhat.com>
> >> -+
> >> -+ * nih/tests/test_file.c: don't use dirent.d_type (not portable)
> >> -+
> >> -+2012-10-25 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the
> >> -+ (e)glibc private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> >> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> >> -+
> >> -+2011-08-31 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> >> -+ (test_unix_fd_to_str): Sanity check value before invoking strchr in
> >> -+ case it returns address of null (which would give a misleading test
> >> -+ pass).
> >> -+ * nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> >> -+ (test_unix_fd_to_str, test_unix_fd_to_str_sync): Sanity check value
> >> -+ before invoking strchr in case it returns address of null (which would
> >> -+ give a misleading test pass).
> >> -+ * nih/config.c (): nih_config_block_end: Add check to ensure strchr()
> >> -+ doesn't return address of null since this would result in a misleading
> >> -+ return value of TRUE.
> >> -+
> >> -+ * nih/string.c (nih_str_split): Fixes to avoid over-running
> >> -+ input string and also returning an empty string array entry
> >> -+ when repeat is true (LP: #834813).
> >> -+ * nih/tests/test_string.c (test_str_split): Added a lot of new
> >> -+ tests for nih_str_split().
> >> -+
> >> -+2011-08-26 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * nih/io.c (nih_io_select_fds): Ensure number of fds being managed
> >> -+ is within limits.
> >> -+
> >> -+ * nih/config.c, nih/error.h, nih/io.c, nih/test_files.h: Correct
> >> -+ typos in comments.
> >> -+
> >> -+2011-06-20 James Hunt <james.hunt@ubuntu.com>
> >> -+
> >> -+ * nih/watch.c (nih_watch_handle): Handle non-directory watches;
> >> -+ previously a file watch resulted in an invalid file path ending in
> >> -+ a single slash (LP:#777097).
> >> -+ * nih/tests/test_watch.c: Added explicit test for watch on a file.
> >> -+
> >> - 2010-12-23 Scott James Remnant <scott@netsplit.com>
> >> -
> >> - * NEWS: Release 1.0.3
> >> ---- libnih-1.0.3.orig/nih/watch.c
> >> -+++ libnih-1.0.3/nih/watch.c
> >> -@@ -2,8 +2,8 @@
> >> - *
> >> - * watch.c - watching of files and directories with inotify
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -71,6 +71,9 @@
> >> - uint32_t events, uint32_t cookie,
> >> - const char *name,
> >> - int *caught_free);
> >> -+static int nih_watch_walk_filter (void *data, const char *path,
> >> -+ int is_dir)
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - /**
> >> -@@ -91,7 +94,7 @@
> >> - * sub-directories will be automatically watched.
> >> - *
> >> - * Additionally, the set of files and directories within @path can be
> >> -- * limited by passing a @filter function which will recieve the paths and
> >> -+ * limited by passing a @filter function which will receive the paths and
> >> - * may return TRUE to indicate that the path received should not be watched.
> >> - *
> >> - * When a file is created within @path, or moved from outside this location
> >> -@@ -104,7 +107,7 @@
> >> - * files that exist under @path when the watch is first added. This only
> >> - * occurs if the watch can be added.
> >> - *
> >> -- * This is a very high level wrapped around the inotify API; lower levels
> >> -+ * This is a very high level wrapper around the inotify API; lower levels
> >> - * can be obtained using the inotify API itself and some of the helper
> >> - * functions used by this one.
> >> - *
> >> -@@ -185,6 +188,35 @@
> >> - }
> >> -
> >> -
> >> -+ /**
> >> -+ * nih_watch_walk_filter:
> >> -+ * @data: NihWatch,
> >> -+ * @path: path to file,
> >> -+ * @is_dir: TRUE if @path is a directory.
> >> -+ *
> >> -+ * Callback function for nih_dir_walk(), used by nih_watch_add() to wrap
> >> -+ * the user-specified NihFileFilter (watch->filter) with a filter that can
> >> -+ * take watch itself as an argument.
> >> -+ *
> >> -+ * Returns: TRUE if the path should be ignored, FALSE otherwise.
> >> -+ **/
> >> -+static int
> >> -+nih_watch_walk_filter (void *data, const char *path, int is_dir)
> >> -+{
> >> -+ NihWatch *watch;
> >> -+
> >> -+ watch = (NihWatch *)data;
> >> -+
> >> -+ nih_assert (watch);
> >> -+
> >> -+ /* No filter, so accept all files */
> >> -+ if (! watch->filter)
> >> -+ return FALSE;
> >> -+
> >> -+ return watch->filter (watch->data, path, is_dir);
> >> -+}
> >> -+
> >> -+
> >> - /**
> >> - * nih_watch_handle_by_wd:
> >> - * @watch: watch to search,
> >> -@@ -295,7 +327,7 @@
> >> - * one; errors within the walk are warned automatically, so if this
> >> - * fails, it means we literally couldn't watch the top-level.
> >> - */
> >> -- if (subdirs && (nih_dir_walk (path, watch->filter,
> >> -+ if (subdirs && (nih_dir_walk (path, nih_watch_walk_filter,
> >> - (NihFileVisitor)nih_watch_add_visitor,
> >> - NULL, watch) < 0)) {
> >> - NihError *err;
> >> -@@ -494,12 +526,21 @@
> >> - return;
> >> - }
> >> -
> >> -+ /* Every other event must come with a name */
> >> -+ if (name && *name) {
> >> -
> >> -- /* Every other event must come with a name. */
> >> -- if ((! name) || strchr (name, '/'))
> >> -- return;
> >> -+ /* If name refers to a directory, there should be no associated
> >> -+ * path - just the name of the path element.
> >> -+ */
> >> -+ if (strchr (name, '/'))
> >> -+ return;
> >> -
> >> -- path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> >> -+ /* Event occured for file within a watched directory */
> >> -+ path = NIH_MUST (nih_sprintf (NULL, "%s/%s", handle->path, name));
> >> -+ } else {
> >> -+ /* File event occured */
> >> -+ path = NIH_MUST (nih_strdup (NULL, handle->path));
> >> -+ }
> >> -
> >> - /* Check the filter */
> >> - if (watch->filter && watch->filter (watch->data, path,
> >> ---- libnih-1.0.3.orig/nih/hash.h
> >> -+++ libnih-1.0.3/nih/hash.h
> >> -@@ -141,7 +141,7 @@
> >> - * @hash: hash table to iterate,
> >> - * @iter: name of iterator variable.
> >> - *
> >> -- * Expans to nested for statements that iterate over each entry in each
> >> -+ * Expands to nested for statements that iterate over each entry in each
> >> - * bin of @hash, except for the bin head pointer, setting @iter to each
> >> - * entry for the block within the loop. A variable named _@iter_i is used
> >> - * to iterate the hash bins.
> >> -@@ -203,7 +203,7 @@
> >> - NihKeyFunction key_function,
> >> - NihHashFunction hash_function,
> >> - NihCmpFunction cmp_function)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihList * nih_hash_add (NihHash *hash, NihList *entry);
> >> - NihList * nih_hash_add_unique (NihHash *hash, NihList *entry);
> >> ---- libnih-1.0.3.orig/nih/main.h
> >> -+++ libnih-1.0.3/nih/main.h
> >> -@@ -138,7 +138,7 @@
> >> -
> >> - NihMainLoopFunc *nih_main_loop_add_func (const void *parent,
> >> - NihMainLoopCb callback, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void nih_main_term_signal (void *data, NihSignal *signal);
> >> -
> >> ---- libnih-1.0.3.orig/nih/command.h
> >> -+++ libnih-1.0.3/nih/command.h
> >> -@@ -123,7 +123,7 @@
> >> -
> >> - NihCommand *nih_command_join (const void *parent,
> >> - const NihCommand *a, const NihCommand *b)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih/config.h
> >> -+++ libnih-1.0.3/nih/config.h
> >> -@@ -140,10 +140,10 @@
> >> - char * nih_config_next_token (const void *parent, const char *file,
> >> - size_t len, size_t *pos, size_t *lineno,
> >> - const char *delim, int dequote)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * nih_config_next_arg (const void *parent, const char *file,
> >> - size_t len, size_t *pos, size_t *lineno)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - void nih_config_next_line (const char *file, size_t len,
> >> - size_t *pos, size_t *lineno);
> >> -
> >> -@@ -155,15 +155,15 @@
> >> -
> >> - char ** nih_config_parse_args (const void *parent, const char *file,
> >> - size_t len, size_t *pos, size_t *lineno)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * nih_config_parse_command (const void *parent, const char *file,
> >> - size_t len, size_t *pos, size_t *lineno)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_config_parse_block (const void *parent, const char *file,
> >> - size_t len, size_t *pos, size_t *lineno,
> >> - const char *type)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - int nih_config_skip_block (const char *file, size_t len,
> >> - size_t *lineno, size_t *pos,
> >> - const char *type, size_t *endpos)
> >> ---- libnih-1.0.3.orig/nih/io.c
> >> -+++ libnih-1.0.3/nih/io.c
> >> -@@ -2,8 +2,8 @@
> >> - *
> >> - * io.c - file and socket input/output handling
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -165,6 +165,7 @@
> >> - nih_assert (readfds != NULL);
> >> - nih_assert (writefds != NULL);
> >> - nih_assert (exceptfds != NULL);
> >> -+ nih_assert (*nfds <= FD_SETSIZE);
> >> -
> >> - nih_io_init ();
> >> -
> >> -@@ -186,6 +187,9 @@
> >> - *nfds = nih_max (*nfds, watch->fd + 1);
> >> - }
> >> - }
> >> -+
> >> -+ /* Re-check in case we exceeded the limit in the loop */
> >> -+ nih_assert (*nfds <= FD_SETSIZE);
> >> - }
> >> -
> >> - /**
> >> -@@ -901,7 +905,7 @@
> >> - * read and placed into the receive buffer or queue, and the reader function
> >> - * is called if set.
> >> - *
> >> -- * Any data or messaages in the send buffer or queue are written out if the
> >> -+ * Any data or messages in the send buffer or queue are written out if the
> >> - * @events includes NIH_IO_WRITE.
> >> - *
> >> - * Errors are handled when data is read, and result in the error handled
> >> -@@ -1211,7 +1215,7 @@
> >> - * This function is called when the local end of a file descriptor being
> >> - * managed by NihIo should be closed. Usually this is because the remote
> >> - * end has been closed (without error) but it can also be because no
> >> -- * error handler was given
> >> -+ * error handler was given.
> >> - *
> >> - * Normally this just calls the close handler, or if not available, it
> >> - * closes the file descriptor and frees the structure (which may be
> >> -@@ -1291,7 +1295,7 @@
> >> - * @io: structure to be destroyed.
> >> - *
> >> - * Closes the file descriptor associated with an NihIo structure so that
> >> -- * the structure can be freed. IF an error is caught by closing the
> >> -+ * the structure can be freed. If an error is caught by closing the
> >> - * descriptor, the error handler is called instead of the error being raised;
> >> - * this allows you to group your error handling in one place rather than
> >> - * special-case close.
> >> ---- libnih-1.0.3.orig/nih/watch.h
> >> -+++ libnih-1.0.3/nih/watch.h
> >> -@@ -156,7 +156,7 @@
> >> - NihCreateHandler create_handler,
> >> - NihModifyHandler modify_handler,
> >> - NihDeleteHandler delete_handler, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_watch_add (NihWatch *watch, const char *path, int subdirs)
> >> - __attribute__ ((warn_unused_result));
> >> ---- libnih-1.0.3.orig/nih/tree.h
> >> -+++ libnih-1.0.3/nih/tree.h
> >> -@@ -344,9 +344,9 @@
> >> -
> >> - void nih_tree_init (NihTree *tree);
> >> - NihTree * nih_tree_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - NihTreeEntry *nih_tree_entry_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihTree * nih_tree_add (NihTree *tree, NihTree *node,
> >> - NihTreeWhere where);
> >> ---- libnih-1.0.3.orig/nih/file.c
> >> -+++ libnih-1.0.3/nih/file.c
> >> -@@ -65,7 +65,7 @@
> >> - /* Prototypes for static functions */
> >> - static char **nih_dir_walk_scan (const char *path, NihFileFilter filter,
> >> - void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static int nih_dir_walk_visit (const char *dirname, NihList *dirs,
> >> - const char *path, NihFileFilter filter,
> >> - NihFileVisitor visitor,
> >> -@@ -619,6 +619,8 @@
> >> - struct dirent *ent;
> >> - char **paths;
> >> - size_t npaths;
> >> -+ int isdir;
> >> -+ struct stat statbuf;
> >> -
> >> - nih_assert (path != NULL);
> >> -
> >> -@@ -640,7 +642,15 @@
> >> - subpath = NIH_MUST (nih_sprintf (NULL, "%s/%s",
> >> - path, ent->d_name));
> >> -
> >> -- if (filter && filter (data, subpath, ent->d_type == DT_DIR))
> >> -+ if (ent->d_type == DT_UNKNOWN) {
> >> -+ if ( lstat (subpath, &statbuf))
> >> -+ isdir = 0;
> >> -+ else
> >> -+ isdir = S_ISDIR(statbuf.st_mode);
> >> -+ } else
> >> -+ isdir = ent->d_type == DT_DIR;
> >> -+
> >> -+ if (filter && filter (data, subpath, isdir))
> >> - continue;
> >> -
> >> - NIH_MUST (nih_str_array_addp (&paths, NULL, &npaths, subpath));
> >> ---- libnih-1.0.3.orig/nih/alloc.c
> >> -+++ libnih-1.0.3/nih/alloc.c
> >> -@@ -119,8 +119,7 @@
> >> - static inline int nih_alloc_context_free (NihAllocCtx *ctx);
> >> -
> >> - static inline NihAllocRef *nih_alloc_ref_new (NihAllocCtx *parent,
> >> -- NihAllocCtx *child)
> >> -- __attribute__ ((malloc));
> >> -+ NihAllocCtx *child);
> >> - static inline void nih_alloc_ref_free (NihAllocRef *ref);
> >> - static inline NihAllocRef *nih_alloc_ref_lookup (NihAllocCtx *parent,
> >> - NihAllocCtx *child);
> >> ---- libnih-1.0.3.orig/nih/timer.h
> >> -+++ libnih-1.0.3/nih/timer.h
> >> -@@ -59,7 +59,7 @@
> >> - * @months: months (1-12),
> >> - * @wdays: days of week (0-7).
> >> - *
> >> -- * Indidcates when scheduled timers should be run, each member is a bit
> >> -+ * Indicates when scheduled timers should be run, each member is a bit
> >> - * field where the bit is 1 if the timer should be run for that value and
> >> - * 0 if not.
> >> - **/
> >> -@@ -117,14 +117,14 @@
> >> -
> >> - NihTimer *nih_timer_add_timeout (const void *parent, time_t timeout,
> >> - NihTimerCb callback, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - NihTimer *nih_timer_add_periodic (const void *parent, time_t period,
> >> - NihTimerCb callback, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - NihTimer *nih_timer_add_scheduled (const void *parent,
> >> - NihTimerSchedule *schedule,
> >> - NihTimerCb callback, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihTimer *nih_timer_next_due (void);
> >> - void nih_timer_poll (void);
> >> ---- libnih-1.0.3.orig/nih/config.c
> >> -+++ libnih-1.0.3/nih/config.c
> >> -@@ -2,8 +2,8 @@
> >> - *
> >> - * config.c - configuration file parsing
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -657,7 +657,7 @@
> >> - * of the returned string are freed, the returned string will also be
> >> - * freed.
> >> - *
> >> -- * Returns: the command found or NULL on raised error.
> >> -+ * Returns: the newly allocated command found or NULL on raised error.
> >> - **/
> >> - char *
> >> - nih_config_parse_command (const void *parent,
> >> -@@ -714,7 +714,7 @@
> >> - * @lineno: line number,
> >> - * @type: block identifier.
> >> - *
> >> -- * Extracts a block of text from @line, stopping when the pharse "end @type"
> >> -+ * Extracts a block of text from @line, stopping when the phrase "end @type"
> >> - * is encountered without any quotes or blackslash escaping within it.
> >> - *
> >> - * @file may be a memory mapped file, in which case @pos should be given
> >> -@@ -950,7 +950,7 @@
> >> - return FALSE;
> >> -
> >> - /* Must be whitespace after */
> >> -- if (! strchr (NIH_CONFIG_WS, file[p + 3]))
> >> -+ if (file[p + 3] && ! strchr (NIH_CONFIG_WS, file[p + 3]))
> >> - return FALSE;
> >> -
> >> - /* Find the second word */
> >> ---- libnih-1.0.3.orig/nih/option.h
> >> -+++ libnih-1.0.3/nih/option.h
> >> -@@ -124,11 +124,11 @@
> >> - char ** nih_option_parser (const void *parent,
> >> - int argc, char *argv[],
> >> - NihOption *options, int break_nonopt)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihOption *nih_option_join (const void *parent,
> >> - const NihOption *a, const NihOption *b)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_option_count (NihOption *option, const char *arg);
> >> - int nih_option_int (NihOption *option, const char *arg);
> >> ---- libnih-1.0.3.orig/nih/signal.h
> >> -+++ libnih-1.0.3/nih/signal.h
> >> -@@ -76,7 +76,7 @@
> >> -
> >> - NihSignal * nih_signal_add_handler (const void *parent, int signum,
> >> - NihSignalHandler handler, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void nih_signal_handler (int signum);
> >> - void nih_signal_poll (void);
> >> ---- libnih-1.0.3.orig/nih/list.h
> >> -+++ libnih-1.0.3/nih/list.h
> >> -@@ -37,7 +37,7 @@
> >> - * after a known entry, and remove an entry from the list.
> >> - *
> >> - * List entries may be created in one of two ways. The most common is to
> >> -- * embed the NihList structure as the frist member of your own structure,
> >> -+ * embed the NihList structure as the first member of your own structure,
> >> - * and initialise it with nih_list_init() after allocating the structure.
> >> - * Alternatively you may create NihListEntry structures with
> >> - * nih_list_entry_new() and point at your own data from them.
> >> -@@ -196,10 +196,10 @@
> >> -
> >> - void nih_list_init (NihList *entry);
> >> - NihList * nih_list_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihListEntry *nih_list_entry_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - NihList * nih_list_add (NihList *list, NihList *entry);
> >> ---- libnih-1.0.3.orig/nih/logging.c
> >> -+++ libnih-1.0.3/nih/logging.c
> >> -@@ -39,11 +39,11 @@
> >> -
> >> -
> >> - /**
> >> -- * __abort_msg:
> >> -+ * __nih_abort_msg:
> >> - *
> >> -- * A glibc variable that keeps the assertion message in the core dump.
> >> -+ * A variable that keeps the assertion message in the core dump.
> >> - **/
> >> --extern char *__abort_msg __attribute__ ((weak));
> >> -+char *__nih_abort_msg = NULL;
> >> -
> >> - /**
> >> - * logger:
> >> -@@ -114,19 +114,16 @@
> >> - * nih_log_abort_message:
> >> - * @message: message to be logged.
> >> - *
> >> -- * Save @message in the glibc __abort_msg variable so it can be retrieved
> >> -+ * Save @message in the __nih_abort_msg variable so it can be retrieved
> >> - * by debuggers if we should crash at this point.
> >> - **/
> >> - static void
> >> - nih_log_abort_message (const char *message)
> >> - {
> >> -- if (! &__abort_msg)
> >> -- return;
> >> -+ if (__nih_abort_msg)
> >> -+ nih_discard (__nih_abort_msg);
> >> -
> >> -- if (__abort_msg)
> >> -- nih_discard (__abort_msg);
> >> --
> >> -- __abort_msg = NIH_MUST (nih_strdup (NULL, message));
> >> -+ __nih_abort_msg = NIH_MUST (nih_strdup (NULL, message));
> >> - }
> >> -
> >> - /**
> >> ---- libnih-1.0.3.orig/nih/test_files.h
> >> -+++ libnih-1.0.3/nih/test_files.h
> >> -@@ -1,7 +1,7 @@
> >> - /* libnih
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -39,7 +39,7 @@
> >> - * TEST_FILENAME:
> >> - * @_var: variable to store filename in.
> >> - *
> >> -- * Generate a filename that may be used for testing, it's unlinked it if
> >> -+ * Generate a filename that may be used for testing, it's unlinked if it
> >> - * exists and it's up to you to unlink it when done. @_var should be at
> >> - * least PATH_MAX long.
> >> - **/
> >> ---- libnih-1.0.3.orig/nih/test_process.h
> >> -+++ libnih-1.0.3/nih/test_process.h
> >> -@@ -36,7 +36,7 @@
> >> - * Spawn a child in which a test can be performed without affecting the
> >> - * main flow of the process. The pid of the child is stored in @_pid.
> >> - *
> >> -- * This macro ensures that the child has begun exectution before the
> >> -+ * This macro ensures that the child has begun execution before the
> >> - * parent is allowed to continue through the usual use of a pipe.
> >> - *
> >> - * A block of code should follow this macro, which is the code that will
> >> ---- libnih-1.0.3.orig/nih/child.h
> >> -+++ libnih-1.0.3/nih/child.h
> >> -@@ -98,7 +98,7 @@
> >> - NihChildWatch *nih_child_add_watch (const void *parent, pid_t pid,
> >> - NihChildEvents events,
> >> - NihChildHandler handler, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void nih_child_poll (void);
> >> -
> >> ---- libnih-1.0.3.orig/nih/alloc.h
> >> -+++ libnih-1.0.3/nih/alloc.h
> >> -@@ -299,7 +299,7 @@
> >> - * It is permissible to take references to foo within its scope, or by
> >> - * functions called, in which case it will not be freed. Also it is
> >> - * generally nonsensical to allocate with a parent, since this too will
> >> -- * prevent it from beign freed.
> >> -+ * prevent it from being freed.
> >> - **/
> >> - #define nih_local __attribute__ ((cleanup(_nih_discard_local)))
> >> -
> >> -@@ -307,11 +307,11 @@
> >> - NIH_BEGIN_EXTERN
> >> -
> >> - void * nih_alloc (const void *parent, size_t size)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void * nih_realloc (void *ptr, const void *parent,
> >> - size_t size)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_free (void *ptr);
> >> - int nih_discard (void *ptr);
> >> ---- libnih-1.0.3.orig/nih/io.h
> >> -+++ libnih-1.0.3/nih/io.h
> >> -@@ -269,7 +269,7 @@
> >> - NihIoWatch * nih_io_add_watch (const void *parent, int fd,
> >> - NihIoEvents events,
> >> - NihIoWatcher watcher, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void nih_io_select_fds (int *nfds, fd_set *readfds,
> >> - fd_set *writefds, fd_set *exceptfds);
> >> -@@ -278,12 +278,12 @@
> >> -
> >> -
> >> - NihIoBuffer * nih_io_buffer_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_io_buffer_resize (NihIoBuffer *buffer, size_t grow);
> >> - char * nih_io_buffer_pop (const void *parent,
> >> - NihIoBuffer *buffer, size_t *len)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - void nih_io_buffer_shrink (NihIoBuffer *buffer, size_t len);
> >> - int nih_io_buffer_push (NihIoBuffer *buffer,
> >> - const char *str, size_t len)
> >> -@@ -291,7 +291,7 @@
> >> -
> >> -
> >> - NihIoMessage *nih_io_message_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_io_message_add_control (NihIoMessage *message, int level,
> >> - int type, socklen_t len,
> >> -@@ -300,7 +300,7 @@
> >> -
> >> - NihIoMessage *nih_io_message_recv (const void *parent, int fd,
> >> - size_t *len)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - ssize_t nih_io_message_send (NihIoMessage *message, int fd)
> >> - __attribute__ ((warn_unused_result));
> >> -
> >> -@@ -310,7 +310,7 @@
> >> - NihIoCloseHandler close_handler,
> >> - NihIoErrorHandler error_handler,
> >> - void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - void nih_io_shutdown (NihIo *io);
> >> - int nih_io_destroy (NihIo *io);
> >> -
> >> -@@ -319,14 +319,14 @@
> >> -
> >> - char * nih_io_read (const void *parent, NihIo *io,
> >> - size_t *len)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - int nih_io_write (NihIo *io, const char *str,
> >> - size_t len)
> >> - __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_io_get (const void *parent, NihIo *io,
> >> - const char *delim)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int nih_io_printf (NihIo *io, const char *format, ...)
> >> - __attribute__ ((warn_unused_result, format (printf, 2, 3)));
> >> ---- libnih-1.0.3.orig/nih/test_output.h
> >> -+++ libnih-1.0.3/nih/test_output.h
> >> -@@ -61,10 +61,10 @@
> >> -
> >> - /**
> >> - * TEST_FEATURE:
> >> -- * @_feat: name of function feature being tested.
> >> -+ * @_feat: name of function or group feature being tested.
> >> - *
> >> -- * Output a message indicating that a sub-test of a function is being
> >> -- * performed, specifically the feature named _feat.
> >> -+ * Output a message indicating that a sub-test of a function or
> >> -+ * group is being performed, specifically the feature named _feat.
> >> - **/
> >> - #define TEST_FEATURE(_feat) \
> >> - printf ("...%s\n", _feat);
> >> ---- libnih-1.0.3.orig/nih/error.h
> >> -+++ libnih-1.0.3/nih/error.h
> >> -@@ -1,7 +1,7 @@
> >> - /* libnih
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -111,7 +111,7 @@
> >> - * @message: human-readable message.
> >> - *
> >> - * Raises an error with the given details in the current error context,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - *
> >> - * @message should be a static string, as it will not be freed when the
> >> -@@ -126,7 +126,7 @@
> >> - * @format: format string for human-readable message.
> >> - *
> >> - * Raises an error with the given details in the current error context,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - *
> >> - * The human-readable message for the error is parsed according to @format,
> >> -@@ -140,7 +140,7 @@
> >> - * nih_error_raise_system:
> >> - *
> >> - * Raises an error with details taken from the current value of errno,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - **/
> >> - #define nih_error_raise_system() \
> >> -@@ -162,7 +162,7 @@
> >> - * @error: existing object to raise.
> >> - *
> >> - * Raises the existing error object in the current error context,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - *
> >> - * This is normally used to raise a taken error that has not been handled,
> >> -@@ -182,7 +182,7 @@
> >> - * @message: human-readable message.
> >> - *
> >> - * Raises an error with the given details in the current error context,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - *
> >> - * Will return from the current function with @retval, which may be left
> >> -@@ -199,7 +199,7 @@
> >> - * @retval: return value for function.
> >> - *
> >> - * Raises an error with details taken from the current value of errno,
> >> -- * if an unhandled error already exists then an error message is emmitted
> >> -+ * if an unhandled error already exists then an error message is emitted
> >> - * through the logging system; you should try to avoid this.
> >> - *
> >> - * Will return from the current function with @retval, which may be left
> >> ---- libnih-1.0.3.orig/nih/string.h
> >> -+++ libnih-1.0.3/nih/string.h
> >> -@@ -35,60 +35,60 @@
> >> - NIH_BEGIN_EXTERN
> >> -
> >> - char * nih_sprintf (const void *parent, const char *format, ...)
> >> -- __attribute__ ((format (printf, 2, 3), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 2, 3), warn_unused_result));
> >> -
> >> - char * nih_vsprintf (const void *parent, const char *format,
> >> - va_list args)
> >> -- __attribute__ ((format (printf, 2, 0), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 2, 0), warn_unused_result));
> >> -
> >> - char * nih_strdup (const void *parent, const char *str)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_strndup (const void *parent, const char *str, size_t len)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_strcat (char **str, const void *parent, const char *src)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * nih_strncat (char **str, const void *parent, const char *src,
> >> - size_t len)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_strcat_sprintf (char **str, const void *parent,
> >> - const char *format, ...)
> >> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> >> - char * nih_strcat_vsprintf (char **str, const void *parent,
> >> - const char *format, va_list args)
> >> -- __attribute__ ((format (printf, 3, 0), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 3, 0), warn_unused_result));
> >> -
> >> - char **nih_str_split (const void *parent, const char *str,
> >> - const char *delim, int repeat)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char **nih_str_array_new (const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char **nih_str_array_add (char ***array, const void *parent, size_t *len,
> >> - const char *str)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char **nih_str_array_addn (char ***array, const void *parent, size_t *len,
> >> - const char *str, size_t strlen)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char **nih_str_array_addp (char ***array, const void *parent, size_t *len,
> >> - void *ptr)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char **nih_str_array_copy (const void *parent, size_t *len,
> >> - char * const *array)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char **nih_str_array_append (char ***array, const void *parent, size_t *len,
> >> - char * const *args)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * nih_str_wrap (const void *parent, const char *str, size_t len,
> >> - size_t first_indent, size_t indent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - size_t nih_str_screen_width (void);
> >> - char * nih_str_screen_wrap (const void *parent, const char *str,
> >> - size_t first_indent, size_t indent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih/string.c
> >> -+++ libnih-1.0.3/nih/string.c
> >> -@@ -405,7 +405,7 @@
> >> - const char *ptr;
> >> -
> >> - /* Skip initial delimiters */
> >> -- while (repeat && strchr (delim, *str))
> >> -+ while (repeat && *str && strchr (delim, *str))
> >> - str++;
> >> -
> >> - /* Find the end of the token */
> >> -@@ -413,6 +413,13 @@
> >> - while (*str && (! strchr (delim, *str)))
> >> - str++;
> >> -
> >> -+ /* Don't create an empty string array element in repeat
> >> -+ * mode if there is no token (as a result of a
> >> -+ * duplicated delimiter character).
> >> -+ */
> >> -+ if (repeat && (str == ptr))
> >> -+ continue;
> >> -+
> >> - if (! nih_str_array_addn (&array, parent, &len,
> >> - ptr, str - ptr)) {
> >> - nih_free (array);
> >> ---- libnih-1.0.3.orig/nih/file.h
> >> -+++ libnih-1.0.3/nih/file.h
> >> -@@ -82,7 +82,7 @@
> >> -
> >> - char *nih_file_read (const void *parent, const char *path,
> >> - size_t *length)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void *nih_file_map (const char *path, int flags, size_t *length)
> >> - __attribute__ ((warn_unused_result));
> >> ---- libnih-1.0.3.orig/nih/tests/test_option.c
> >> -+++ libnih-1.0.3/nih/tests/test_option.c
> >> -@@ -1574,7 +1574,7 @@
> >> - output = tmpfile ();
> >> - TEST_CHILD (pid) {
> >> - TEST_DIVERT_STDOUT (output) {
> >> -- char **args;
> >> -+ char **args __attribute__((unused));
> >> -
> >> - args = nih_option_parser (NULL, argc, argv,
> >> - options, FALSE);
> >> -@@ -1652,7 +1652,7 @@
> >> - unsetenv ("COLUMNS");
> >> -
> >> - TEST_DIVERT_STDOUT (output) {
> >> -- char **args;
> >> -+ char **args __attribute__((unused));
> >> -
> >> - args = nih_option_parser (NULL, argc, argv,
> >> - options, FALSE);
> >> ---- libnih-1.0.3.orig/nih/tests/test_logging.c
> >> -+++ libnih-1.0.3/nih/tests/test_logging.c
> >> -@@ -31,7 +31,7 @@
> >> - #include <nih/main.h>
> >> -
> >> -
> >> --extern char *__abort_msg __attribute__ ((weak));
> >> -+extern char *__nih_abort_msg;
> >> -
> >> - static NihLogLevel last_priority = NIH_LOG_UNKNOWN;
> >> - static char * last_message = NULL;
> >> -@@ -156,68 +156,63 @@
> >> - }
> >> -
> >> -
> >> -- /* Check that a fatal message is also stored in the glibc __abort_msg
> >> -+ /* Check that a fatal message is also stored in the __nih_abort_msg
> >> - * variable.
> >> - */
> >> -- if (&__abort_msg) {
> >> -- TEST_FEATURE ("with fatal message");
> >> -- TEST_ALLOC_FAIL {
> >> -- __abort_msg = NULL;
> >> -- last_priority = NIH_LOG_UNKNOWN;
> >> -- last_message = NULL;
> >> --
> >> -- ret = nih_log_message (NIH_LOG_FATAL,
> >> -- "message with %s %d formatting",
> >> -- "some", 20);
> >> --
> >> -- TEST_EQ (ret, 0);
> >> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
> >> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
> >> --
> >> -- TEST_NE_P (__abort_msg, NULL);
> >> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
> >> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> >> -+ TEST_FEATURE ("with fatal message");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ __nih_abort_msg = NULL;
> >> -+ last_priority = NIH_LOG_UNKNOWN;
> >> -+ last_message = NULL;
> >> -
> >> -- free (last_message);
> >> -- }
> >> -+ ret = nih_log_message (NIH_LOG_FATAL,
> >> -+ "message with %s %d formatting",
> >> -+ "some", 20);
> >> -
> >> -+ TEST_EQ (ret, 0);
> >> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
> >> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
> >> -
> >> -- /* Check that a fatal message can safely overwrite one already stored
> >> -- * in the glibc __abort_msg variable.
> >> -- */
> >> -- TEST_FEATURE ("with second fatal message");
> >> -- TEST_ALLOC_FAIL {
> >> -- TEST_ALLOC_SAFE {
> >> -- msg = nih_strdup (NULL, "test");
> >> -- }
> >> --
> >> -- __abort_msg = msg;
> >> -- TEST_FREE_TAG (msg);
> >> --
> >> -- last_priority = NIH_LOG_UNKNOWN;
> >> -- last_message = NULL;
> >> --
> >> -- ret = nih_log_message (NIH_LOG_FATAL,
> >> -- "message with %s %d formatting",
> >> -- "some", 20);
> >> --
> >> -- TEST_EQ (ret, 0);
> >> -- TEST_EQ (last_priority, NIH_LOG_FATAL);
> >> -- TEST_EQ_STR (last_message, "message with some 20 formatting");
> >> --
> >> -- TEST_FREE (msg);
> >> --
> >> -- TEST_NE_P (__abort_msg, NULL);
> >> -- TEST_ALLOC_PARENT (__abort_msg, NULL);
> >> -- TEST_EQ_STR (__abort_msg, "message with some 20 formatting");
> >> -+ TEST_NE_P (__nih_abort_msg, NULL);
> >> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> >> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> >> -
> >> -- free (last_message);
> >> -- }
> >> -- } else {
> >> -- printf ("SKIP: __abort_msg not available\n");
> >> -+ free (last_message);
> >> - }
> >> -
> >> -
> >> -+ /* Check that a fatal message can safely overwrite one already stored
> >> -+ * in the __nih_abort_msg variable.
> >> -+ */
> >> -+ TEST_FEATURE ("with second fatal message");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ TEST_ALLOC_SAFE {
> >> -+ msg = nih_strdup (NULL, "test");
> >> -+ }
> >> -+
> >> -+ __nih_abort_msg = msg;
> >> -+ TEST_FREE_TAG (msg);
> >> -+
> >> -+ last_priority = NIH_LOG_UNKNOWN;
> >> -+ last_message = NULL;
> >> -+
> >> -+ ret = nih_log_message (NIH_LOG_FATAL,
> >> -+ "message with %s %d formatting",
> >> -+ "some", 20);
> >> -+
> >> -+ TEST_EQ (ret, 0);
> >> -+ TEST_EQ (last_priority, NIH_LOG_FATAL);
> >> -+ TEST_EQ_STR (last_message, "message with some 20 formatting");
> >> -+
> >> -+ TEST_FREE (msg);
> >> -+
> >> -+ TEST_NE_P (__nih_abort_msg, NULL);
> >> -+ TEST_ALLOC_PARENT (__nih_abort_msg, NULL);
> >> -+ TEST_EQ_STR (__nih_abort_msg, "message with some 20 formatting");
> >> -+
> >> -+ free (last_message);
> >> -+ }
> >> -+
> >> - /* Check that the nih_debug macro wraps the call properly and
> >> - * includes the function in which the message occurred.
> >> - */
> >> ---- libnih-1.0.3.orig/nih/tests/test_hash.c
> >> -+++ libnih-1.0.3/nih/tests/test_hash.c
> >> -@@ -470,7 +470,8 @@
> >> - test_lookup (void)
> >> - {
> >> - NihHash *hash;
> >> -- NihList *entry1, *entry2, *entry3, *ptr;
> >> -+ NihList *entry1, *entry2, *ptr;
> >> -+ NihList *entry3 __attribute__((unused));
> >> -
> >> - TEST_FUNCTION ("nih_hash_lookup");
> >> - hash = nih_hash_string_new (NULL, 0);
> >> ---- libnih-1.0.3.orig/nih/tests/test_main.c
> >> -+++ libnih-1.0.3/nih/tests/test_main.c
> >> -@@ -457,7 +457,7 @@
> >> - test_main_loop (void)
> >> - {
> >> - NihMainLoopFunc *func;
> >> -- NihTimer *timer;
> >> -+ NihTimer *timer __attribute__((unused));
> >> - int ret;
> >> -
> >> - /* Check that we can run through the main loop, and that the
> >> ---- libnih-1.0.3.orig/nih/tests/test_watch.c
> >> -+++ libnih-1.0.3/nih/tests/test_watch.c
> >> -@@ -2,8 +2,8 @@
> >> - *
> >> - * test_watch.c - test suite for nih/watch.c
> >> - *
> >> -- * Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
> >> -- * Copyright © 2009 Canonical Ltd.
> >> -+ * Copyright © 2011 Scott James Remnant <scott@netsplit.com>.
> >> -+ * Copyright © 2011 Canonical Ltd.
> >> - *
> >> - * This program is free software; you can redistribute it and/or modify
> >> - * it under the terms of the GNU General Public License version 2, as
> >> -@@ -39,6 +39,8 @@
> >> - #include <nih/error.h>
> >> - #include <nih/logging.h>
> >> -
> >> -+/* Read "The Hitchhikers Guide to the Galaxy" */
> >> -+#define FILTER_VALUE 42
> >> -
> >> - static int
> >> - my_filter (void *data,
> >> -@@ -54,6 +56,26 @@
> >> - return FALSE;
> >> - }
> >> -
> >> -+/* Set by my_filter2 () so it knows if it has already been called */
> >> -+static int my_filter2_called = 0;
> >> -+
> >> -+static int
> >> -+my_filter2 (int *value,
> >> -+ const char *path,
> >> -+ int is_dir)
> >> -+{
> >> -+ /* we only want to toggle the value once */
> >> -+ if (my_filter2_called)
> >> -+ return TRUE;
> >> -+
> >> -+ my_filter2_called = 1;
> >> -+
> >> -+ nih_assert (value && *value == FILTER_VALUE);
> >> -+ *value = 0;
> >> -+
> >> -+ return FALSE;
> >> -+}
> >> -+
> >> - static int create_called = 0;
> >> - static int modify_called = 0;
> >> - static int delete_called = 0;
> >> -@@ -553,6 +575,44 @@
> >> - nih_free (watch);
> >> - }
> >> -
> >> -+ /* Ensure the file filter gets passed the correct data pointer.
> >> -+ */
> >> -+ TEST_FEATURE ("with filter and data");
> >> -+
> >> -+ /* Ensure we have a new directory */
> >> -+ TEST_FILENAME (dirname);
> >> -+ mkdir (dirname, 0755);
> >> -+
> >> -+ /* Create a single file */
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/foo");
> >> -+
> >> -+ fd = fopen (filename, "w");
> >> -+ fprintf (fd, "test\n");
> >> -+ fclose (fd);
> >> -+
> >> -+ TEST_ALLOC_FAIL {
> >> -+ int watch_data = FILTER_VALUE;
> >> -+
> >> -+ /* Reset required to appease TEST_ALLOC_FAIL */
> >> -+ my_filter2_called = 0;
> >> -+
> >> -+ watch = nih_watch_new (NULL, dirname,
> >> -+ TRUE, TRUE,
> >> -+ (NihFileFilter)my_filter2,
> >> -+ NULL, NULL, NULL,
> >> -+ &watch_data);
> >> -+
> >> -+ TEST_NE_P (watch, NULL);
> >> -+
> >> -+ /* Ensure the filter was called and changed the value */
> >> -+
> >> -+ TEST_NE (my_filter2_called, 0);
> >> -+ TEST_EQ (watch_data, 0);
> >> -+
> >> -+ nih_free (watch);
> >> -+ }
> >> -+
> >> - strcpy (filename, dirname);
> >> - strcat (filename, "/bar");
> >> - chmod (filename, 0755);
> >> -@@ -946,13 +1006,82 @@
> >> - nih_error_init ();
> >> -
> >> - TEST_FILENAME (dirname);
> >> -- mkdir (dirname, 0755);
> >> -+ TEST_EQ (mkdir (dirname, 0755), 0);
> >> -
> >> -- watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> >> -- my_create_handler, my_modify_handler,
> >> -+ TEST_FEATURE ("with watched file");
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/foo");
> >> -+
> >> -+ /* Create file first since we don't set a create handler on the
> >> -+ * watch.
> >> -+ */
> >> -+ fd = fopen (filename, "w");
> >> -+ fprintf (fd, "bar\n");
> >> -+ fclose (fd);
> >> -+
> >> -+ create_called = 0;
> >> -+ modify_called = 0;
> >> -+ delete_called = 0;
> >> -+ logger_called = 0;
> >> -+ last_path = NULL;
> >> -+ last_watch = NULL;
> >> -+ last_data = NULL;
> >> -+
> >> -+ watch = nih_watch_new (NULL, filename, FALSE, FALSE, NULL,
> >> -+ NULL, my_modify_handler,
> >> - my_delete_handler, &watch);
> >> -+ TEST_NE_P (watch, NULL);
> >> -+
> >> -+ /* Now, modify the existing file to trigger the modify handler. */
> >> -+ fd = fopen (filename, "a+");
> >> -+ fprintf (fd, "baz\n");
> >> -+ fclose (fd);
> >> -+
> >> -+ nfds = 0;
> >> -+ FD_ZERO (&readfds);
> >> -+ FD_ZERO (&writefds);
> >> -+ FD_ZERO (&exceptfds);
> >> -+
> >> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> >> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
> >> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> >> -+
> >> -+ TEST_EQ_STR (watch->path, filename);
> >> -+
> >> -+ /* Ensure no regression to old behaviour (LP:#777097) */
> >> -+ TEST_NE (last_path[ strlen(last_path) - 1 ], '/');
> >> -+
> >> -+ TEST_EQ_STR (last_path, filename);
> >> -+ TEST_EQ (modify_called, 1);
> >> -+
> >> -+ unlink (filename);
> >> -+
> >> -+ nfds = 0;
> >> -+ FD_ZERO (&readfds);
> >> -+ FD_ZERO (&writefds);
> >> -+ FD_ZERO (&exceptfds);
> >> -+
> >> -+ nih_io_select_fds (&nfds, &readfds, &writefds, &exceptfds);
> >> -+ select (nfds, &readfds, &writefds, &exceptfds, NULL);
> >> -+ nih_io_handle_fds (&readfds, &writefds, &exceptfds);
> >> -
> >> -+ TEST_EQ (delete_called, 1);
> >> -
> >> -+ rmdir (filename);
> >> -+ nih_free (last_path);
> >> -+
> >> -+ create_called = 0;
> >> -+ modify_called = 0;
> >> -+ delete_called = 0;
> >> -+ logger_called = 0;
> >> -+ last_path = NULL;
> >> -+ last_watch = NULL;
> >> -+ last_data = NULL;
> >> -+
> >> -+
> >> -+ watch = nih_watch_new (NULL, dirname, TRUE, TRUE, my_filter,
> >> -+ my_create_handler, my_modify_handler,
> >> -+ my_delete_handler, &watch);
> >> - /* Check that creating a file within the directory being watched
> >> - * results in the create handler being called, and passed the full
> >> - * path of the created file to it.
> >> ---- libnih-1.0.3.orig/nih/tests/test_string.c
> >> -+++ libnih-1.0.3/nih/tests/test_string.c
> >> -@@ -619,6 +619,215 @@
> >> - nih_free (array);
> >> - }
> >> -
> >> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> >> -+ "characters at string start");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "\t\tthis is a test", " \t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> >> -+ for (i = 0; i < 6; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "");
> >> -+ TEST_EQ_STR (array[1], "");
> >> -+ TEST_EQ_STR (array[2], "this");
> >> -+ TEST_EQ_STR (array[3], "is");
> >> -+ TEST_EQ_STR (array[4], "a");
> >> -+ TEST_EQ_STR (array[5], "test");
> >> -+ TEST_EQ_P (array[6], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> >> -+ "characters at string start");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, " \tthis is a test", " \t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> >> -+ for (i = 0; i < 6; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "");
> >> -+ TEST_EQ_STR (array[1], "");
> >> -+ TEST_EQ_STR (array[2], "this");
> >> -+ TEST_EQ_STR (array[3], "is");
> >> -+ TEST_EQ_STR (array[4], "a");
> >> -+ TEST_EQ_STR (array[5], "test");
> >> -+ TEST_EQ_P (array[6], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> >> -+ "characters within string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "this is a\t\ttest", " \t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 8);
> >> -+ for (i = 0; i < 7; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "this");
> >> -+ TEST_EQ_STR (array[1], "is");
> >> -+ TEST_EQ_STR (array[2], "");
> >> -+ TEST_EQ_STR (array[3], "");
> >> -+ TEST_EQ_STR (array[4], "a");
> >> -+ TEST_EQ_STR (array[5], "");
> >> -+ TEST_EQ_STR (array[6], "test");
> >> -+ TEST_EQ_P (array[7], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> >> -+ "characters within string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "this is \n\ta\ttest", " \t\n", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 7);
> >> -+ for (i = 0; i < 6; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "this");
> >> -+ TEST_EQ_STR (array[1], "is");
> >> -+ TEST_EQ_STR (array[2], "");
> >> -+ TEST_EQ_STR (array[3], "");
> >> -+ TEST_EQ_STR (array[4], "a");
> >> -+ TEST_EQ_STR (array[5], "test");
> >> -+ TEST_EQ_P (array[6], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> >> -+ "characters at string end");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "this is a test ", " \t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> >> -+ for (i = 0; i < 5; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "this");
> >> -+ TEST_EQ_STR (array[1], "is");
> >> -+ TEST_EQ_STR (array[2], "a");
> >> -+ TEST_EQ_STR (array[3], "test");
> >> -+ TEST_EQ_STR (array[4], "");
> >> -+ TEST_EQ_P (array[5], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> >> -+ "characters at string end");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "this is a test \t", " \t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 6);
> >> -+ for (i = 0; i < 5; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "this");
> >> -+ TEST_EQ_STR (array[1], "is");
> >> -+ TEST_EQ_STR (array[2], "a");
> >> -+ TEST_EQ_STR (array[3], "test");
> >> -+ TEST_EQ_STR (array[4], "");
> >> -+ TEST_EQ_P (array[5], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple identical delimiter "
> >> -+ "characters at beginning, middle and end of string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, " this is\n\n\na test\t\t\t", " \t\n", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 12);
> >> -+ for (i = 0; i < 11; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "");
> >> -+ TEST_EQ_STR (array[1], "");
> >> -+ TEST_EQ_STR (array[2], "");
> >> -+ TEST_EQ_STR (array[3], "this");
> >> -+ TEST_EQ_STR (array[4], "is");
> >> -+ TEST_EQ_STR (array[5], "");
> >> -+ TEST_EQ_STR (array[6], "");
> >> -+ TEST_EQ_STR (array[7], "a");
> >> -+ TEST_EQ_STR (array[8], "test");
> >> -+ TEST_EQ_STR (array[9], "");
> >> -+ TEST_EQ_STR (array[10], "");
> >> -+ TEST_EQ_P (array[11], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with no repeat and multiple different delimiter "
> >> -+ "characters at beginning, middle and end of string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, ": \nthis is\t \n:a test:\n ", "\n :\t", FALSE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 13);
> >> -+ for (i = 0; i < 12; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "");
> >> -+ TEST_EQ_STR (array[1], "");
> >> -+ TEST_EQ_STR (array[2], "");
> >> -+ TEST_EQ_STR (array[3], "this");
> >> -+ TEST_EQ_STR (array[4], "is");
> >> -+ TEST_EQ_STR (array[5], "");
> >> -+ TEST_EQ_STR (array[6], "");
> >> -+ TEST_EQ_STR (array[7], "");
> >> -+ TEST_EQ_STR (array[8], "a");
> >> -+ TEST_EQ_STR (array[9], "test");
> >> -+ TEST_EQ_STR (array[10], "");
> >> -+ TEST_EQ_STR (array[11], "");
> >> -+ TEST_EQ_P (array[12], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -
> >> - /* Check that we can split a string treating multiple consecutive
> >> - * matching characters as a single separator to be skipped.
> >> -@@ -645,6 +854,177 @@
> >> - nih_free (array);
> >> - }
> >> -
> >> -+ /* Check that we can split a string containing multiple
> >> -+ * occurences of one of the delimiter characters at the
> >> -+ * beginning of the string.
> >> -+ */
> >> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter characters at string start");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "\n\nhello", " \t\r\n", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> >> -+ for (i = 0; i < 1; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_P (array[1], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter characters at string start");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "\n\r hello", " \t\r\n", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> >> -+ for (i = 0; i < 1; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_P (array[1], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> >> -+ "characters within string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "hello\n\rworld", " \t\n\r", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> >> -+ for (i = 0; i < 2; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_STR (array[1], "world");
> >> -+ TEST_EQ_P (array[2], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> >> -+ "characters within string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "hello\n\r\tworld", " \t\n\r", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 3);
> >> -+ for (i = 0; i < 2; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_STR (array[1], "world");
> >> -+ TEST_EQ_P (array[2], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> >> -+ "characters at string end");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "hello\n\n\n\n\n\n\n", " \t\r\n", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> >> -+ for (i = 0; i < 1; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_P (array[1], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> >> -+ "characters at string end");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL, "hello \r\t\r\t\n ", " \t\r\n", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 2);
> >> -+ for (i = 0; i < 1; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_P (array[1], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple identical adjacent delimiter "
> >> -+ "characters at beginning, middle and end of string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL,
> >> -+ " hello\n\n\n, world\n\n\n",
> >> -+ "\r\t\n ", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> >> -+ for (i = 0; i < 3; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_STR (array[1], ",");
> >> -+ TEST_EQ_STR (array[2], "world");
> >> -+ TEST_EQ_P (array[3], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -+
> >> -+ TEST_FEATURE ("with repeat and multiple different adjacent delimiter "
> >> -+ "characters at beginning, middle and end of string");
> >> -+ TEST_ALLOC_FAIL {
> >> -+ array = nih_str_split (NULL,
> >> -+ "\n \r\thello\n\n\r , \n\t\rworld\t \r\n \n",
> >> -+ " \t\n\r", TRUE);
> >> -+
> >> -+ if (test_alloc_failed) {
> >> -+ TEST_EQ_P (array, NULL);
> >> -+ continue;
> >> -+ }
> >> -+
> >> -+ TEST_ALLOC_SIZE (array, sizeof (char *) * 4);
> >> -+ for (i = 0; i < 3; i++)
> >> -+ TEST_ALLOC_PARENT (array[i], array);
> >> -+
> >> -+ TEST_EQ_STR (array[0], "hello");
> >> -+ TEST_EQ_STR (array[1], ",");
> >> -+ TEST_EQ_STR (array[2], "world");
> >> -+ TEST_EQ_P (array[3], NULL);
> >> -+
> >> -+ nih_free (array);
> >> -+ }
> >> -
> >> - /* Check that we can give an empty string, and end up with a
> >> - * one-element array that only contains a NULL pointer.
> >> ---- libnih-1.0.3.orig/nih/tests/test_file.c
> >> -+++ libnih-1.0.3/nih/tests/test_file.c
> >> -@@ -724,6 +724,25 @@
> >> - return FALSE;
> >> - }
> >> -
> >> -+/* find only frodo files */
> >> -+static int
> >> -+my_filter_frodo_file (void *data,
> >> -+ const char *path,
> >> -+ int is_dir)
> >> -+{
> >> -+ char *slash;
> >> -+
> >> -+ if (is_dir)
> >> -+ return FALSE;
> >> -+
> >> -+ slash = strrchr (path, '/');
> >> -+ if (strcmp (slash, "/frodo"))
> >> -+ return TRUE;
> >> -+
> >> -+ return FALSE;
> >> -+}
> >> -+
> >> -+
> >> - static int logger_called = 0;
> >> -
> >> - static int
> >> -@@ -905,6 +924,48 @@
> >> - TEST_EQ_STR (v->path, filename);
> >> -
> >> - nih_free (visited);
> >> -+
> >> -+ /* Try also inverse filter */
> >> -+ TEST_ALLOC_SAFE {
> >> -+ visitor_called = 0;
> >> -+ visited = nih_list_new (NULL);
> >> -+ }
> >> -+
> >> -+ ret = nih_dir_walk (dirname, my_filter_frodo_file,
> >> -+ my_visitor, NULL, &ret);
> >> -+
> >> -+ TEST_EQ (ret, 0);
> >> -+ TEST_EQ (visitor_called, 4);
> >> -+
> >> -+ v = (Visited *)visited->next;
> >> -+ TEST_EQ (v->data, &ret);
> >> -+ TEST_EQ_STR (v->dirname, dirname);
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/bar");
> >> -+ TEST_EQ_STR (v->path, filename);
> >> -+
> >> -+ v = (Visited *)v->entry.next;
> >> -+ TEST_EQ (v->data, &ret);
> >> -+ TEST_EQ_STR (v->dirname, dirname);
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/bar/frodo");
> >> -+ TEST_EQ_STR (v->path, filename);
> >> -+
> >> -+ v = (Visited *)v->entry.next;
> >> -+ TEST_EQ (v->data, &ret);
> >> -+ TEST_EQ_STR (v->dirname, dirname);
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/baz");
> >> -+ TEST_EQ_STR (v->path, filename);
> >> -+
> >> -+ v = (Visited *)v->entry.next;
> >> -+ TEST_EQ (v->data, &ret);
> >> -+ TEST_EQ_STR (v->dirname, dirname);
> >> -+ strcpy (filename, dirname);
> >> -+ strcat (filename, "/frodo");
> >> -+ TEST_EQ_STR (v->path, filename);
> >> -+
> >> -+ nih_free (visited);
> >> - }
> >> -
> >> -
> >> ---- libnih-1.0.3.orig/debian/control
> >> -+++ libnih-1.0.3/debian/control
> >> -@@ -0,0 +1,81 @@
> >> -+Source: libnih
> >> -+Section: libs
> >> -+Priority: required
> >> -+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
> >> -+XSBC-Original-Maintainer: Scott James Remnant <scott@netsplit.com>
> >> -+Standards-Version: 3.9.4
> >> -+Build-Depends: debhelper (>= 9), pkg-config (>= 0.22), libdbus-1-dev (>= 1.4), libexpat1-dev (>= 2.0.0), dbus (>= 1.4), libc6-dev (>= 2.15~) | libc6.1-dev (>= 2.15~),
> >> -+ dh-autoreconf, autopoint, dpkg-dev (>= 1.16.1~)
> >> -+# To cross build this package also needs: libdbus-1-dev:native (>= 1.4), libexpat1-dev:native (>= 2.0.0)
> >> -+# But :native build-deps are not supported yet, so instead one can do
> >> -+# $ apt-get build-dep libnih
> >> -+# $ apt-get build-dep libnih -aarmhf
> >> -+# instead to get all required build-deps
> >> -+Vcs-Bzr: lp:ubuntu/libnih
> >> -+XSC-Debian-Vcs-Git: git://git.debian.org/git/collab-maint/libnih.git
> >> -+XSC-Debian-Vcs-Browser: http://git.debian.org/?p=collab-maint/libnih.git;a=summary
> >> -+Homepage: https://launchpad.net/libnih
> >> -+
> >> -+Package: libnih1
> >> -+Architecture: any
> >> -+Pre-Depends: ${misc:Pre-Depends}, ${shlibs:Depends}, ${misc:Depends}
> >> -+Multi-Arch: same
> >> -+Description: NIH Utility Library
> >> -+ libnih is a light-weight "standard library" of C functions to ease the
> >> -+ development of other libraries and applications, especially those
> >> -+ normally found in /lib.
> >> -+ .
> >> -+ This package contains the shared library.
> >> -+
> >> -+Package: libnih-dev
> >> -+Priority: optional
> >> -+Section: libdevel
> >> -+Architecture: any
> >> -+Multi-Arch: same
> >> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> >> -+Description: NIH Utility Library (development files)
> >> -+ libnih is a light-weight "standard library" of C functions to ease the
> >> -+ development of other libraries and applications, especially those
> >> -+ normally found in /lib.
> >> -+ .
> >> -+ This package contains the static library and C header files which are
> >> -+ needed for developing software using libnih.
> >> -+
> >> -+Package: libnih-dbus1
> >> -+Architecture: any
> >> -+Pre-Depends: ${misc:Pre-Depends}
> >> -+Depends: libnih1 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> >> -+Multi-Arch: same
> >> -+Description: NIH D-Bus Bindings Library
> >> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
> >> -+ loop provided by libnih.
> >> -+ .
> >> -+ This package contains the shared library.
> >> -+
> >> -+Package: libnih-dbus-dev
> >> -+Priority: optional
> >> -+Section: libdevel
> >> -+Architecture: any
> >> -+Multi-Arch: same
> >> -+Depends: libnih-dbus1 (= ${binary:Version}), libnih-dev (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends}
> >> -+Recommends: nih-dbus-tool (= ${binary:Version})
> >> -+Description: NIH D-Bus Bindings Library (development files)
> >> -+ libnih-dbus is a D-Bus bindings library that integrates with the main
> >> -+ loop provided by libnih.
> >> -+ .
> >> -+ This package contains the static library and C header files which are
> >> -+ needed for developing software using libnih-dbus.
> >> -+
> >> -+Package: nih-dbus-tool
> >> -+Section: devel
> >> -+Architecture: any
> >> -+Multi-Arch: foreign
> >> -+Depends: ${shlibs:Depends}, ${misc:Depends}
> >> -+Recommends: libnih-dbus-dev (= ${binary:Version})
> >> -+Description: NIH D-Bus Binding Tool
> >> -+ nih-dbus-tool generates C source code from the D-Bus Introspection XML
> >> -+ data provided by most services; either to make implementing the
> >> -+ described objects in C programs or to make proxying to the described
> >> -+ remote objects easier.
> >> -+ .
> >> -+ The generated code requires libnih-dbus-dev to be compiled.
> >> ---- libnih-1.0.3.orig/debian/libnih-dev.install
> >> -+++ libnih-1.0.3/debian/libnih-dev.install
> >> -@@ -0,0 +1,6 @@
> >> -+lib/*/libnih.a
> >> -+lib/*/libnih.so
> >> -+usr/include/libnih.h
> >> -+usr/include/nih
> >> -+usr/lib/*/pkgconfig/libnih.pc
> >> -+usr/share/aclocal/libnih.m4
> >> ---- libnih-1.0.3.orig/debian/libnih1.docs
> >> -+++ libnih-1.0.3/debian/libnih1.docs
> >> -@@ -0,0 +1,3 @@
> >> -+AUTHORS
> >> -+NEWS
> >> -+README
> >> ---- libnih-1.0.3.orig/debian/libnih-dbus1.install
> >> -+++ libnih-1.0.3/debian/libnih-dbus1.install
> >> -@@ -0,0 +1 @@
> >> -+lib/*/libnih-dbus.so.*
> >> ---- libnih-1.0.3.orig/debian/libnih1.install
> >> -+++ libnih-1.0.3/debian/libnih1.install
> >> -@@ -0,0 +1 @@
> >> -+lib/*/libnih.so.*
> >> ---- libnih-1.0.3.orig/debian/rules
> >> -+++ libnih-1.0.3/debian/rules
> >> -@@ -0,0 +1,54 @@
> >> -+#!/usr/bin/make -f
> >> -+
> >> -+include /usr/share/dpkg/architecture.mk
> >> -+
> >> -+%:
> >> -+ dh $@ --with autoreconf
> >> -+
> >> -+
> >> -+CFLAGS := -Wall -fstack-protector -fPIE $(shell dpkg-buildflags --get CFLAGS)
> >> -+LDFLAGS := -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -pie $(shell dpkg-buildflags --get LDFLAGS)
> >> -+
> >> -+override_dh_auto_configure:
> >> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> >> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> >> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
> >> -+else
> >> -+ dh_auto_configure -B build-dbus-tool/ -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> >> -+ --libdir=/lib/$(DEB_BUILD_MULTIARCH) \
> >> -+ --host=$(DEB_BUILD_GNU_TYPE)
> >> -+ dh_auto_build -B build-dbus-tool/ --parallel
> >> -+ dh_auto_configure -- CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
> >> -+ NIH_DBUS_TOOL=$(CURDIR)/build-dbus-tool/nih-dbus-tool/nih-dbus-tool \
> >> -+ --libdir=/lib/$(DEB_HOST_MULTIARCH)
> >> -+endif
> >> -+
> >> -+override_dh_auto_build:
> >> -+ dh_auto_build --parallel
> >> -+
> >> -+override_dh_auto_test:
> >> -+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
> >> -+ dh_auto_test --parallel
> >> -+endif
> >> -+
> >> -+override_dh_auto_install:
> >> -+ dh_auto_install -- pkgconfigdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
> >> -+
> >> -+override_dh_makeshlibs:
> >> -+ dh_makeshlibs -plibnih1 -V 'libnih1 (>= 1.0.0)'
> >> -+ dh_makeshlibs -plibnih-dbus1 -V 'libnih-dbus1 (>= 1.0.0)'
> >> -+ dh_makeshlibs -Nlibnih1 -Nlibnih-dbus1
> >> -+
> >> -+override_dh_shlibdeps:
> >> -+ dh_shlibdeps
> >> -+ sed -i 's/2\.14/2.15/' debian/*.substvars
> >> -+ sed -i 's/>= 2.15)/>= 2.15~)/g' debian/*.substvars
> >> -+
> >> -+
> >> -+# Symlink /usr/share/doc directories together
> >> -+override_dh_installdocs:
> >> -+ dh_installdocs --link-doc=libnih1
> >> -+
> >> -+override_dh_clean:
> >> -+ rm -rf build-dbus-tool/
> >> -+ dh_clean
> >> ---- libnih-1.0.3.orig/debian/compat
> >> -+++ libnih-1.0.3/debian/compat
> >> -@@ -0,0 +1 @@
> >> -+9
> >> ---- libnih-1.0.3.orig/debian/nih-dbus-tool.install
> >> -+++ libnih-1.0.3/debian/nih-dbus-tool.install
> >> -@@ -0,0 +1,2 @@
> >> -+usr/bin/nih-dbus-tool
> >> -+usr/share/man/man1/nih-dbus-tool.1
> >> ---- libnih-1.0.3.orig/debian/copyright
> >> -+++ libnih-1.0.3/debian/copyright
> >> -@@ -0,0 +1,18 @@
> >> -+This is the Ubuntu package of libnih, the NIH Utility Library.
> >> -+
> >> -+Copyright © 2009 Canonical Ltd.
> >> -+Copyright © 2009 Scott James Remnant <scott@netsplit.com>
> >> -+
> >> -+Licence:
> >> -+
> >> -+This program is free software; you can redistribute it and/or modify
> >> -+it under the terms of the GNU General Public License version 2, as
> >> -+published by the Free Software Foundation.
> >> -+
> >> -+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.
> >> -+
> >> -+On Ubuntu systems, the complete text of the GNU General Public License
> >> -+can be found in ‘/usr/share/common-licenses/GPL-2’.
> >> ---- libnih-1.0.3.orig/debian/libnih-dbus1.postinst
> >> -+++ libnih-1.0.3/debian/libnih-dbus1.postinst
> >> -@@ -0,0 +1,53 @@
> >> -+#!/bin/sh
> >> -+
> >> -+set -e
> >> -+
> >> -+if [ "$1" = configure ]; then
> >> -+ # A dependent library of Upstart has changed, so restart Upstart
> >> -+ # such that it can safely unmount the root filesystem (LP: #740390)
> >> -+
> >> -+ # Query running version of Upstart, but only when we know
> >> -+ # that initctl will work.
> >> -+ #
> >> -+ # The calculated version string may be the null string if
> >> -+ # Upstart is not running (where for example an alternative
> >> -+ # init is running outside a chroot environment) or if the
> >> -+ # query failed for some reason. However, the version check
> >> -+ # below handles a null version string correctly.
> >> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> >> -+ awk '{print $3}'|tr -d ')' || :)
> >> -+
> >> -+ if ischroot; then
> >> -+ # Do not honour re-exec when requested from within a
> >> -+ # chroot since:
> >> -+ #
> >> -+ # (a) The version of Upstart outside might not support it.
> >> -+ # (b) An isolated environment such as a chroot should
> >> -+ # not be able to modify its containing environment.
> >> -+ #
> >> -+ # A sufficiently new Upstart will actually handle a re-exec
> >> -+ # request coming from telinit within a chroot correctly (by
> >> -+ # doing nothing) but it's simple enough to perform the check
> >> -+ # here and save Upstart the effort.
> >> -+ :
> >> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> >> -+ # We are not running inside a chroot and the running version
> >> -+ # of Upstart supports stateful re-exec, so we can
> >> -+ # restart immediately.
> >> -+ #
> >> -+ # XXX: Note that the check on the running version must
> >> -+ # remain *indefinitely* since it's the only safe way to
> >> -+ # know if stateful re-exec is supported: simply checking
> >> -+ # packaged version numbers is not sufficient since
> >> -+ # the package could be upgraded multiple times without a
> >> -+ # reboot.
> >> -+ telinit u || :
> >> -+ else
> >> -+ # Before we shutdown or reboot, we need to re-exec so that we
> >> -+ # can safely remount the root filesystem; we can't just do that
> >> -+ # here because we lose state.
> >> -+ touch /var/run/init.upgraded || :
> >> -+ fi
> >> -+fi
> >> -+
> >> -+#DEBHELPER#
> >> ---- libnih-1.0.3.orig/debian/changelog.DEBIAN
> >> -+++ libnih-1.0.3/debian/changelog.DEBIAN
> >> -@@ -0,0 +1,118 @@
> >> -+libnih (1.0.3-4) unstable; urgency=low
> >> -+
> >> -+ * Rebuild for new libc to update versioned dependency; this comes from
> >> -+ the __abort_msg dependency, dpkg-shlibs needs overriding since this is
> >> -+ actually a weak link, but this rebuild fixes things for now.
> >> -+ Closes: #625257.
> >> -+
> >> -+ -- Scott James Remnant <scott@netsplit.com> Mon, 02 May 2011 15:08:33 -0700
> >> -+
> >> -+libnih (1.0.3-3) unstable; urgency=low
> >> -+
> >> -+ * New maintainer. Closes: #624442.
> >> -+
> >> -+ -- Scott James Remnant <scott@netsplit.com> Thu, 28 Apr 2011 14:26:05 -0700
> >> -+
> >> -+libnih (1.0.3-2) unstable; urgency=low
> >> -+
> >> -+ * Bump build dependency on libdbus-1-dev and dbus to (>= 1.4) for Unix file
> >> -+ descriptor passing support.
> >> -+
> >> -+ -- Michael Biebl <biebl@debian.org> Thu, 10 Feb 2011 20:25:18 +0100
> >> -+
> >> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
> >> -+
> >> -+ * Rebuild with libc6-dev (>= 2.13~).
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
> >> -+
> >> -+libnih (1.0.3-1) unstable; urgency=low
> >> -+
> >> -+ * New upstream release.
> >> -+ * Bump debhelper compatibility level to 8 and update build dependency
> >> -+ accordingly.
> >> -+
> >> -+ -- Michael Biebl <biebl@debian.org> Mon, 07 Feb 2011 22:19:13 +0100
> >> -+
> >> -+libnih (1.0.2-2) unstable; urgency=low
> >> -+
> >> -+ * Install library development files to /usr/lib and not /lib.
> >> -+ * Remove libtool *.la files as there are no reverse dependencies referencing
> >> -+ them.
> >> -+ * Bump Standards-Version to 3.9.1. No further changes.
> >> -+
> >> -+ -- Michael Biebl <biebl@debian.org> Sun, 02 Jan 2011 21:09:40 +0100
> >> -+
> >> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
> >> -+
> >> -+ * Disable some tests on ppc64 to build an initial package.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
> >> -+
> >> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
> >> -+
> >> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> >> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> >> -+
> >> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
> >> -+
> >> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
> >> -+
> >> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
> >> -+ __abort_msg is available with the same signature in eglibc 2.12.
> >> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
> >> -+
> >> -+libnih (1.0.2-1) unstable; urgency=low
> >> -+
> >> -+ * Initial upload to Debian. Closes: #585071
> >> -+ * Based on the Ubuntu package for Lucid done by Scott James Remnant with the
> >> -+ following changes:
> >> -+ - Switch packages to priority optional.
> >> -+ - Use binary:Version instead of Source-Version.
> >> -+ - Bump Standards-Version to 3.8.4.
> >> -+ - Add Homepage and Vcs-* fields.
> >> -+ - Don't symlink /usr/share/doc directories.
> >> -+ - Refer to versioned /usr/share/common-licenses/GPL-2 file in
> >> -+ debian/copyright.
> >> -+ - List all symbols explicitly instead of using a wildcard and add symbols
> >> -+ introduced in 1.0.1.
> >> -+ - Use the symbols files to create the correct version info instead of
> >> -+ specifying it manually via shlibs.
> >> -+ - Switch to source format 3.0 (quilt).
> >> -+ - Add watch file to track new upstream releases.
> >> -+
> >> -+ -- Michael Biebl <biebl@debian.org> Sun, 13 Jun 2010 23:36:52 +0200
> >> -+
> >> -+libnih (1.0.1-1) lucid; urgency=low
> >> -+
> >> -+ * New upstream release:
> >> -+ - Add missing __nih_* symbols to linker version script so that we
> >> -+ can link Upstart's test suite.
> >> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
> >> -+
> >> -+libnih (1.0.0-2build1) lucid; urgency=low
> >> -+
> >> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
> >> -+ __abort_msg is available with the same signature in eglibc 2.11.
> >> -+ LP: #508702.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
> >> -+
> >> -+libnih (1.0.0-2) lucid; urgency=low
> >> -+
> >> -+ * debian/control: Add build-dependency on dbus so the test suite can
> >> -+ pass on the buildds.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
> >> -+
> >> -+libnih (1.0.0-1) lucid; urgency=low
> >> -+
> >> -+ * First upstream release. Previously this code was included in the
> >> -+ upstart, mountall and ureadahead source packages.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
> >> -+
> >> ---- libnih-1.0.3.orig/debian/libnih1.symbols
> >> -+++ libnih-1.0.3/debian/libnih1.symbols
> >> -@@ -0,0 +1,2 @@
> >> -+libnih.so.1 libnih1 #MINVER#
> >> -+ *@LIBNIH_1_0 1.0.0
> >> ---- libnih-1.0.3.orig/debian/libnih-dbus-dev.install
> >> -+++ libnih-1.0.3/debian/libnih-dbus-dev.install
> >> -@@ -0,0 +1,5 @@
> >> -+lib/*/libnih-dbus.a
> >> -+lib/*/libnih-dbus.so
> >> -+usr/include/libnih-dbus.h
> >> -+usr/include/nih-dbus
> >> -+usr/lib/*/pkgconfig/libnih-dbus.pc
> >> ---- libnih-1.0.3.orig/debian/libnih1.postinst
> >> -+++ libnih-1.0.3/debian/libnih1.postinst
> >> -@@ -0,0 +1,53 @@
> >> -+#!/bin/sh
> >> -+
> >> -+set -e
> >> -+
> >> -+if [ "$1" = configure ]; then
> >> -+ # A dependent library of Upstart has changed, so restart Upstart
> >> -+ # such that it can safely unmount the root filesystem (LP: #740390)
> >> -+
> >> -+ # Query running version of Upstart, but only when we know
> >> -+ # that initctl will work.
> >> -+ #
> >> -+ # The calculated version string may be the null string if
> >> -+ # Upstart is not running (where for example an alternative
> >> -+ # init is running outside a chroot environment) or if the
> >> -+ # query failed for some reason. However, the version check
> >> -+ # below handles a null version string correctly.
> >> -+ UPSTART_VERSION_RUNNING=$(initctl version 2>/dev/null |\
> >> -+ awk '{print $3}'|tr -d ')' || :)
> >> -+
> >> -+ if ischroot; then
> >> -+ # Do not honour re-exec when requested from within a
> >> -+ # chroot since:
> >> -+ #
> >> -+ # (a) The version of Upstart outside might not support it.
> >> -+ # (b) An isolated environment such as a chroot should
> >> -+ # not be able to modify its containing environment.
> >> -+ #
> >> -+ # A sufficiently new Upstart will actually handle a re-exec
> >> -+ # request coming from telinit within a chroot correctly (by
> >> -+ # doing nothing) but it's simple enough to perform the check
> >> -+ # here and save Upstart the effort.
> >> -+ :
> >> -+ elif dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 1.6.1; then
> >> -+ # We are not running inside a chroot and the running version
> >> -+ # of Upstart supports stateful re-exec, so we can
> >> -+ # restart immediately.
> >> -+ #
> >> -+ # XXX: Note that the check on the running version must
> >> -+ # remain *indefinitely* since it's the only safe way to
> >> -+ # know if stateful re-exec is supported: simply checking
> >> -+ # packaged version numbers is not sufficient since
> >> -+ # the package could be upgraded multiple times without a
> >> -+ # reboot.
> >> -+ telinit u || :
> >> -+ else
> >> -+ # Before we shutdown or reboot, we need to re-exec so that we
> >> -+ # can safely remount the root filesystem; we can't just do that
> >> -+ # here because we lose state.
> >> -+ touch /var/run/init.upgraded || :
> >> -+ fi
> >> -+fi
> >> -+
> >> -+#DEBHELPER#
> >> ---- libnih-1.0.3.orig/debian/libnih-dbus1.symbols
> >> -+++ libnih-1.0.3/debian/libnih-dbus1.symbols
> >> -@@ -0,0 +1,2 @@
> >> -+libnih-dbus.so.1 libnih-dbus1 #MINVER#
> >> -+ *@LIBNIH_DBUS_1_0 1.0.0
> >> ---- libnih-1.0.3.orig/debian/changelog
> >> -+++ libnih-1.0.3/debian/changelog
> >> -@@ -0,0 +1,213 @@
> >> -+libnih (1.0.3-4ubuntu16) raring; urgency=low
> >> -+
> >> -+ * debian/{libnih1.postinst,libnih-dbus1.postinst}: Force an upgrade to
> >> -+ restart Upstart (to pick up new package version) if the running
> >> -+ instance supports it.
> >> -+ * Merge of important fixes from lp:~upstart-devel/libnih/nih
> >> -+ (LP: #776532, LP: #777097, LP: #834813, LP: #1123588).
> >> -+
> >> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 14 Mar 2013 09:14:22 +0000
> >> -+
> >> -+libnih (1.0.3-4ubuntu15) raring; urgency=low
> >> -+
> >> -+ * Enable cross-building, sans adding :native build-dependencies.
> >> -+ See comments in debian/control.
> >> -+ * Lintian fixes.
> >> -+
> >> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 08 Jan 2013 15:38:58 +0000
> >> -+
> >> -+libnih (1.0.3-4ubuntu14) raring; urgency=low
> >> -+
> >> -+ * Update dbus code generator to allow for empty lists for type 'as'.
> >> -+ This drops the != NULL check for NULL terminated arrays and moves the
> >> -+ iteration loop inside an 'if' statement.
> >> -+
> >> -+ -- Stéphane Graber <stgraber@ubuntu.com> Thu, 13 Dec 2012 10:00:27 -0500
> >> -+
> >> -+libnih (1.0.3-4ubuntu13) raring; urgency=low
> >> -+
> >> -+ [ Petr Lautrbach <plautrba@redhat.com>, Dmitrijs Ledkovs ]
> >> -+ * Fallback to lstat, if dirent.d_type is not available (not portable)
> >> -+ (LP: #672643) (Closes: #695604)
> >> -+
> >> -+ -- Dmitrijs Ledkovs <dmitrij.ledkov@ubuntu.com> Tue, 11 Dec 2012 17:26:52 +0000
> >> -+
> >> -+libnih (1.0.3-4ubuntu12) raring; urgency=low
> >> -+
> >> -+ * nih/logging.c: Use our own __nih_abort_msg rather than the (e)glibc
> >> -+ private symbol __abort_msg to avoid upgrade issues (LP: #997359).
> >> -+ * nih/tests/test_logging.c: Update tests for __nih_abort_msg.
> >> -+
> >> -+ -- James Hunt <james.hunt@ubuntu.com> Thu, 25 Oct 2012 10:57:30 +0100
> >> -+
> >> -+libnih (1.0.3-4ubuntu11) quantal; urgency=low
> >> -+
> >> -+ * Addition of debian/libnih-dbus1.postinst and
> >> -+ debian/libnih1.postinst to force Upstart re-exec on shutdown
> >> -+ to avoid unmounting disks uncleanly (LP: #740390).
> >> -+
> >> -+ -- James Hunt <james.hunt@ubuntu.com> Wed, 03 Oct 2012 16:49:40 +0100
> >> -+
> >> -+libnih (1.0.3-4ubuntu10) quantal; urgency=low
> >> -+
> >> -+ * Update config.guess,sub for aarch64
> >> -+
> >> -+ -- Wookey <wookey@wookware.org> Mon, 01 Oct 2012 12:57:05 +0100
> >> -+
> >> -+libnih (1.0.3-4ubuntu9) precise; urgency=low
> >> -+
> >> -+ * Mark the nih-dbus-tool package Multi-Arch: foreign so it can be used as
> >> -+ a build-dependency of upstart when cross-building.
> >> -+
> >> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Wed, 15 Feb 2012 22:57:50 -0800
> >> -+
> >> -+libnih (1.0.3-4ubuntu8) precise; urgency=low
> >> -+
> >> -+ * libnih1 needs a versioned Pre-Depend on libc6 instead of just a Depend,
> >> -+ because libc6 itself uses runlevel from the upstart package in its
> >> -+ preinst, which in turn uses libnih1, which needs to be loadable (i.e.,
> >> -+ its symbol references resolve). We therefore need to ensure that
> >> -+ libnih1's dependencies are always unpacked before libnih1 itself is
> >> -+ unpacked. While having something further up the stack (such as upstart,
> >> -+ or something on top of upstart) being marked Essential: yes and with the
> >> -+ necessary pre-depends would let apt handle this for us with its
> >> -+ "immediate configuration" support, but for various reasons we don't want
> >> -+ to make upstart essential. LP: #508083.
> >> -+
> >> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Fri, 10 Feb 2012 12:13:25 -0800
> >> -+
> >> -+libnih (1.0.3-4ubuntu7) precise; urgency=low
> >> -+
> >> -+ * Relax dependency on libc6.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 23:43:21 +0100
> >> -+
> >> -+libnih (1.0.3-4ubuntu6) precise; urgency=low
> >> -+
> >> -+ * Rebuild with libc6-dev (>= 2.15~).
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 08 Feb 2012 21:48:57 +0100
> >> -+
> >> -+libnih (1.0.3-4ubuntu5) precise; urgency=low
> >> -+
> >> -+ * Mark libnih-dev and libnih-dbus-dev Multi-Arch: same as well.
> >> -+
> >> -+ -- Steve Langasek <steve.langasek@ubuntu.com> Sun, 06 Nov 2011 14:45:07 -0800
> >> -+
> >> -+libnih (1.0.3-4ubuntu4) precise; urgency=low
> >> -+
> >> -+ * Make libnih1 and libnih-dbus1 installable using multi-arch.
> >> -+
> >> -+ -- James Hunt <james.hunt@ubuntu.com> Tue, 01 Nov 2011 14:25:09 -0400
> >> -+
> >> -+libnih (1.0.3-4ubuntu3) precise; urgency=low
> >> -+
> >> -+ * Build to install with eglibc-2.15.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 14 Oct 2011 14:05:03 +0200
> >> -+
> >> -+libnih (1.0.3-4ubuntu2) oneiric; urgency=low
> >> -+
> >> -+ * Use dpkg-buildflags to get the build flags.
> >> -+ * Build with the default build flags, don't hard-code -Os. LP: #791315.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Wed, 15 Jun 2011 16:45:42 +0200
> >> -+
> >> -+libnih (1.0.3-4ubuntu1) oneiric; urgency=low
> >> -+
> >> -+ * Merge from debian unstable. Retained Ubuntu Build-Depends and Priority.
> >> -+
> >> -+ -- James Hunt <james.hunt@ubuntu.com> Mon, 23 May 2011 19:28:19 +0100
> >> -+
> >> -+libnih (1.0.3-1ubuntu1) natty; urgency=low
> >> -+
> >> -+ * Rebuild with libc6-dev (>= 2.13~).
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Fri, 18 Feb 2011 12:09:29 +0100
> >> -+
> >> -+libnih (1.0.3-1) natty; urgency=low
> >> -+
> >> -+ * New upstream release:
> >> -+ - Added support for passing file descriptors over D-Bus to nih-dbus-tool
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 23 Dec 2010 22:28:24 +0000
> >> -+
> >> -+libnih (1.0.2-2) natty; urgency=low
> >> -+
> >> -+ * Revert the previous upload. It is never acceptable to simply disable
> >> -+ tests, especially when it turns out that the test that was disabled
> >> -+ was failing because there was a serious bug that could cause kernel
> >> -+ panics for people on boot.
> >> -+
> >> -+ Test suites are here for a reason.
> >> -+
> >> -+ * Bumped libdbus Build-Dependency to the version with the bug fix that
> >> -+ caused the test suite to fail.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Wed, 08 Dec 2010 19:40:15 +0000
> >> -+
> >> -+libnih (1.0.2-1ubuntu3) natty; urgency=low
> >> -+
> >> -+ * Disable some tests on ppc64 to build an initial package.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Thu, 18 Nov 2010 10:59:38 +0100
> >> -+
> >> -+libnih (1.0.2-1ubuntu2) maverick; urgency=low
> >> -+
> >> -+ * Re-add -fPIE to the testsuite on armel, removing all armel-specific tests;
> >> -+ current gcc-4.4 don't seem affected by the ICE anymore (see LP #398403).
> >> -+
> >> -+ -- Loïc Minier <loic.minier@linaro.org> Mon, 23 Aug 2010 10:25:31 +0200
> >> -+
> >> -+libnih (1.0.2-1ubuntu1) maverick; urgency=low
> >> -+
> >> -+ * Rebuild with libc6-dev (>= 2.12~), after checking that
> >> -+ __abort_msg is available with the same signature in eglibc 2.12.
> >> -+ * Don't build the testsuite with -fPIE on armel; LP: #398403.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Sun, 30 May 2010 02:54:56 +0200
> >> -+
> >> -+libnih (1.0.2-1) maverick; urgency=low
> >> -+
> >> -+ * New upstream release:
> >> -+ - Rename AC_COPYRIGHT to NIH_COPYRIGHT to avoid conflict with other
> >> -+ packages.
> >> -+ - Add serial to libnih.m4
> >> -+ - Add NIH_WITH_LOCAL_LIBNIH macro.
> >> -+
> >> -+ * Fix use of ${Source-Version} to be ${binary:Version}
> >> -+ * Add debian/source/format with "1.0" to be future compatible.
> >> -+ * Bump standards version.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Tue, 27 Apr 2010 10:49:55 -0700
> >> -+
> >> -+libnih (1.0.1-1) lucid; urgency=low
> >> -+
> >> -+ * New upstream release:
> >> -+ - Add missing __nih_* symbols to linker version script so that we
> >> -+ can link Upstart's test suite.
> >> -+ - Glibc __abort_msg symbol now only linked as a weak symbol.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Thu, 04 Feb 2010 14:53:26 -0800
> >> -+
> >> -+libnih (1.0.0-2build1) lucid; urgency=low
> >> -+
> >> -+ * Rebuild to pick up relaxed dependency on libc6, after checking that
> >> -+ __abort_msg is available with the same signature in eglibc 2.11.
> >> -+ LP: #508702.
> >> -+
> >> -+ -- Matthias Klose <doko@ubuntu.com> Mon, 18 Jan 2010 16:09:13 +0100
> >> -+
> >> -+libnih (1.0.0-2) lucid; urgency=low
> >> -+
> >> -+ * debian/control: Add build-dependency on dbus so the test suite can
> >> -+ pass on the buildds.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 23:28:27 +0000
> >> -+
> >> -+libnih (1.0.0-1) lucid; urgency=low
> >> -+
> >> -+ * First upstream release. Previously this code was included in the
> >> -+ upstart, mountall and ureadahead source packages.
> >> -+
> >> -+ -- Scott James Remnant <scott@ubuntu.com> Sat, 28 Nov 2009 21:14:00 +0000
> >> ---- libnih-1.0.3.orig/debian/source/format
> >> -+++ libnih-1.0.3/debian/source/format
> >> -@@ -0,0 +1 @@
> >> -+1.0
> >> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.h
> >> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.h
> >> -@@ -146,14 +146,14 @@
> >> - const char *name, const char *path,
> >> - NihDBusLostHandler lost_handler,
> >> - void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NihDBusProxySignal *nih_dbus_proxy_connect (NihDBusProxy *proxy,
> >> - const NihDBusInterface *interface,
> >> - const char *name,
> >> - NihDBusSignalHandler handler,
> >> - void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus/dbus_object.h
> >> -+++ libnih-1.0.3/nih-dbus/dbus_object.h
> >> -@@ -61,8 +61,7 @@
> >> - DBusConnection *connection,
> >> - const char *path,
> >> - const NihDBusInterface **interfaces,
> >> -- void *data)
> >> -- __attribute__ ((malloc));
> >> -+ void *data);
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus/dbus_util.h
> >> -+++ libnih-1.0.3/nih-dbus/dbus_util.h
> >> -@@ -26,7 +26,7 @@
> >> - NIH_BEGIN_EXTERN
> >> -
> >> - char *nih_dbus_path (const void *parent, const char *root, ...)
> >> -- __attribute__ ((sentinel, warn_unused_result, malloc));
> >> -+ __attribute__ ((sentinel, warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus/dbus_pending_data.h
> >> -+++ libnih-1.0.3/nih-dbus/dbus_pending_data.h
> >> -@@ -104,7 +104,7 @@
> >> - NihDBusReplyHandler handler,
> >> - NihDBusErrorHandler error_handler,
> >> - void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus/dbus_proxy.c
> >> -+++ libnih-1.0.3/nih-dbus/dbus_proxy.c
> >> -@@ -46,11 +46,11 @@
> >> - __attribute__ ((warn_unused_result));
> >> - static char *nih_dbus_proxy_name_rule (const void *parent,
> >> - NihDBusProxy *proxy)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static int nih_dbus_proxy_signal_destroy (NihDBusProxySignal *proxied);
> >> - static char *nih_dbus_proxy_signal_rule (const void *parent,
> >> - NihDBusProxySignal *proxied)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - /* Prototypes for handler functions */
> >> - static DBusHandlerResult nih_dbus_proxy_name_owner_changed (DBusConnection *connection,
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/symbol.c
> >> -@@ -40,10 +40,10 @@
> >> - /* Prototypes for static functions */
> >> - static char *symbol_strcat_interface (char **str, const void *parent,
> >> - const char *format, ...)
> >> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> >> - static char *symbol_strcat_title (char **str, const void *parent,
> >> - const char *format, ...)
> >> -- __attribute__ ((format (printf, 3, 4), warn_unused_result, malloc));
> >> -+ __attribute__ ((format (printf, 3, 4), warn_unused_result));
> >> -
> >> -
> >> - /**
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.h
> >> -@@ -37,7 +37,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/symbol.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/symbol.h
> >> -@@ -28,22 +28,22 @@
> >> - int symbol_valid (const char *symbol);
> >> -
> >> - char *symbol_from_name (const void *parent, const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char *symbol_impl (const void *parent, const char *prefix,
> >> - const char *interface_name, const char *name,
> >> - const char *postfix)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char *symbol_extern (const void *parent, const char *prefix,
> >> - const char *interface_symbol, const char *midfix,
> >> - const char *symbol, const char *postfix)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char *symbol_typedef (const void *parent, const char *prefix,
> >> - const char *interface_symbol, const char *midfix,
> >> - const char *symbol, const char *postfix)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/output.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/output.h
> >> -@@ -35,9 +35,9 @@
> >> - __attribute__ ((warn_unused_result));
> >> -
> >> - char *output_preamble (const void *parent, const char *path)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char *output_sentinel (const void *parent, const char *path)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/parse.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/parse.h
> >> -@@ -95,7 +95,7 @@
> >> -
> >> - ParseStack *parse_stack_push (const void *parent, NihList *stack,
> >> - ParseStackType type, void *data)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - ParseStack *parse_stack_top (NihList *stack);
> >> -
> >> - void parse_start_tag (XML_Parser xmlp, const char *tag,
> >> -@@ -103,7 +103,7 @@
> >> - void parse_end_tag (XML_Parser xmlp, const char *tag);
> >> -
> >> - Node * parse_xml (const void *parent, int fd, const char *filename)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/type.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/type.h
> >> -@@ -94,43 +94,43 @@
> >> -
> >> - char * type_of (const void * parent,
> >> - DBusSignatureIter *iter)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - TypeVar * type_var_new (const void *parent, const char *type,
> >> - const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_var_to_string (const void *parent, TypeVar *var)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_var_layout (const void *parent, NihList *vars)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - TypeFunc * type_func_new (const void *parent, const char *type,
> >> - const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_func_to_string (const void *parent, TypeFunc *func)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_func_to_typedef (const void *parent, TypeFunc *func)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_func_layout (const void *parent, NihList *funcs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - TypeStruct *type_struct_new (const void *parent, const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_struct_to_string (const void *parent, TypeStruct *structure)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * type_to_const (char **type, const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_to_pointer (char **type, const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_to_static (char **type, const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * type_to_extern (char **type, const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * type_strcat_assert (char **block, const void *parent,
> >> - TypeVar *var, TypeVar *prev, TypeVar *next)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/argument.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/argument.h
> >> -@@ -61,7 +61,7 @@
> >> -
> >> - Argument *argument_new (const void *parent, const char *name,
> >> - const char *type, NihDBusArgDir direction)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int argument_start_tag (XML_Parser xmlp, const char *tag,
> >> - char * const *attr)
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/indent.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/indent.h
> >> -@@ -26,9 +26,9 @@
> >> - NIH_BEGIN_EXTERN
> >> -
> >> - char *indent (char **str, const void *parent, int level)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char *comment (char **str, const void *parent)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/main.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/main.c
> >> -@@ -52,10 +52,10 @@
> >> - /* Prototypes for local functions */
> >> - char *source_file_path (const void *parent, const char *output_path,
> >> - const char *filename)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char *header_file_path (const void *parent, const char *output_path,
> >> - const char *filename)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - /**
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/signal.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/signal.h
> >> -@@ -58,7 +58,7 @@
> >> - int signal_name_valid (const char *name);
> >> -
> >> - Signal * signal_new (const void *parent, const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int signal_start_tag (XML_Parser xmlp, const char *tag,
> >> - char * const *attr)
> >> -@@ -76,18 +76,18 @@
> >> - char * signal_object_function (const void *parent, const char *prefix,
> >> - Interface *interface, Signal *signal,
> >> - NihList *prototypes, NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * signal_proxy_function (const void *parent, const char *prefix,
> >> - Interface *interface, Signal *signal,
> >> - NihList *prototypes, NihList *typedefs,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * signal_args_array (const void *parent, const char *prefix,
> >> - Interface *interface, Signal *signal,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/marshal.c
> >> -@@ -49,7 +49,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static char *marshal_array (const void *parent,
> >> - DBusSignatureIter *iter,
> >> - const char *iter_name, const char *name,
> >> -@@ -58,7 +58,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static char *marshal_struct (const void *parent,
> >> - DBusSignatureIter *iter,
> >> - const char *iter_name, const char *name,
> >> -@@ -67,7 +67,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - /**
> >> -@@ -364,6 +364,7 @@
> >> - nih_local TypeVar *element_len_var = NULL;
> >> - nih_local char * block = NULL;
> >> - nih_local char * vars_block = NULL;
> >> -+ nih_local char * loop_block = NULL;
> >> -
> >> - nih_assert (iter != NULL);
> >> - nih_assert (iter_name != NULL);
> >> -@@ -448,7 +449,7 @@
> >> - nih_list_add (locals, &array_iter_var->entry);
> >> -
> >> - if (dbus_type_is_fixed (element_type)) {
> >> -- if (! nih_strcat_sprintf (&code, parent,
> >> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> >> - "for (size_t %s = 0; %s < %s; %s++) {\n",
> >> - loop_name, loop_name, len_name, loop_name)) {
> >> - nih_free (code);
> >> -@@ -456,6 +457,12 @@
> >> - }
> >> - } else {
> >> - if (! nih_strcat_sprintf (&code, parent,
> >> -+ "if (%s) {\n",
> >> -+ name)) {
> >> -+ nih_free (code);
> >> -+ return NULL;
> >> -+ }
> >> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> >> - "for (size_t %s = 0; %s[%s]; %s++) {\n",
> >> - loop_name, name, loop_name, loop_name)) {
> >> - nih_free (code);
> >> -@@ -576,7 +583,7 @@
> >> - }
> >> -
> >> -
> >> -- if (! nih_strcat_sprintf (&code, parent,
> >> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> >> - "%s"
> >> - "\n"
> >> - "%s"
> >> -@@ -590,9 +597,34 @@
> >> - }
> >> -
> >> - /* Close the container again */
> >> -+ if (! nih_strcat_sprintf (&loop_block, parent,
> >> -+ "}\n")) {
> >> -+ nih_free (code);
> >> -+ return NULL;
> >> -+ }
> >> -+
> >> -+ if (dbus_type_is_fixed (element_type)) {
> >> -+ if (! nih_strcat_sprintf (&code, parent,
> >> -+ "%s\n", loop_block)) {
> >> -+ nih_free (code);
> >> -+ return NULL;
> >> -+ }
> >> -+ }
> >> -+ else {
> >> -+ if (! indent (&loop_block, NULL, 1)) {
> >> -+ nih_free (code);
> >> -+ return NULL;
> >> -+ }
> >> -+
> >> -+ if (! nih_strcat_sprintf (&code, parent,
> >> -+ "%s"
> >> -+ "}\n\n", loop_block)) {
> >> -+ nih_free (code);
> >> -+ return NULL;
> >> -+ }
> >> -+ }
> >> -+
> >> - if (! nih_strcat_sprintf (&code, parent,
> >> -- "}\n"
> >> -- "\n"
> >> - "if (! dbus_message_iter_close_container (&%s, &%s)) {\n"
> >> - "%s"
> >> - "}\n",
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/demarshal.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/demarshal.c
> >> -@@ -51,7 +51,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static char *demarshal_array (const void *parent,
> >> - DBusSignatureIter *iter,
> >> - const char *parent_name,
> >> -@@ -62,7 +62,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - static char *demarshal_struct (const void *parent,
> >> - DBusSignatureIter *iter,
> >> - const char *parent_name,
> >> -@@ -73,7 +73,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - /**
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/interface.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/interface.h
> >> -@@ -61,7 +61,7 @@
> >> -
> >> - Interface *interface_new (const void *parent,
> >> - const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int interface_start_tag (XML_Parser xmlp,
> >> - const char *tag,
> >> -@@ -81,26 +81,26 @@
> >> - Interface *interface,
> >> - int with_handlers,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * interface_signals_array (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> - int with_filters,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * interface_properties_array (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> - int with_handlers,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * interface_struct (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> - int object,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> -
> >> - char * interface_proxy_get_all_function (const void *parent,
> >> -@@ -108,7 +108,7 @@
> >> - Interface *interface,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * interface_proxy_get_all_notify_function (const void *parent,
> >> - const char *prefix,
> >> -@@ -116,14 +116,14 @@
> >> - NihList *prototypes,
> >> - NihList *typedefs,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * interface_proxy_get_all_sync_function (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/method.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/method.h
> >> -@@ -62,7 +62,7 @@
> >> - int method_name_valid (const char *name);
> >> -
> >> - Method * method_new (const void *parent, const char *name)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int method_start_tag (XML_Parser xmlp, const char *tag,
> >> - char * const *attr)
> >> -@@ -82,33 +82,33 @@
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes, NihList *handlers,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * method_reply_function (const void *parent, const char *prefix,
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes, NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * method_proxy_function (const void *parent, const char *prefix,
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes, NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * method_proxy_notify_function (const void *parent, const char *prefix,
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes, NihList *typedefs,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * method_proxy_sync_function (const void *parent, const char *prefix,
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes, NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * method_args_array (const void *parent, const char *prefix,
> >> - Interface *interface, Method *method,
> >> - NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/node.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/node.h
> >> -@@ -47,7 +47,7 @@
> >> - int node_path_valid (const char *name);
> >> -
> >> - Node * node_new (const void *parent, const char *path)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int node_start_tag (XML_Parser xmlp, const char *tag,
> >> - char * const *attr)
> >> -@@ -59,18 +59,18 @@
> >> -
> >> - char * node_interfaces_array (const void *parent, const char *prefix,
> >> - Node *node, int object, NihList *prototypes)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * node_object_functions (const void *parent, const char *prefix,
> >> - Node *node,
> >> - NihList *prototypes, NihList *handlers,
> >> - NihList *structs, NihList *externs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * node_proxy_functions (const void *parent, const char *prefix,
> >> - Node *node,
> >> - NihList *prototypes, NihList *structs,
> >> - NihList *typedefs, NihList *externs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/marshal.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/marshal.h
> >> -@@ -35,7 +35,7 @@
> >> - const char *prefix, const char *interface_symbol,
> >> - const char *member_symbol, const char *symbol,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/type.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/type.c
> >> -@@ -1101,7 +1101,7 @@
> >> - nih_assert (block != NULL);
> >> - nih_assert (var != NULL);
> >> -
> >> -- if (! strchr (var->type, '*'))
> >> -+ if (! strchr (var->type, '*') || ! strcmp (var->type, "char * const *"))
> >> - return *block;
> >> -
> >> - if (next && (! strcmp (next->type, "size_t"))) {
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/property.h
> >> -+++ libnih-1.0.3/nih-dbus-tool/property.h
> >> -@@ -65,7 +65,7 @@
> >> - const char *name,
> >> - const char *type,
> >> - NihDBusAccess access)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - int property_start_tag (XML_Parser xmlp, const char *tag,
> >> - char * const *attr)
> >> -@@ -88,7 +88,7 @@
> >> - NihList *prototypes,
> >> - NihList *handlers,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * property_object_set_function (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> -@@ -96,7 +96,7 @@
> >> - NihList *prototypes,
> >> - NihList *handlers,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * property_proxy_get_function (const void *parent,
> >> - const char *prefix,
> >> -@@ -104,7 +104,7 @@
> >> - Property *property,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * property_proxy_get_notify_function (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> -@@ -112,7 +112,7 @@
> >> - NihList *prototypes,
> >> - NihList *typedefs,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * property_proxy_set_function (const void *parent,
> >> - const char *prefix,
> >> -@@ -120,7 +120,7 @@
> >> - Property *property,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * property_proxy_set_notify_function (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> -@@ -128,7 +128,7 @@
> >> - NihList *prototypes,
> >> - NihList *typedefs,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - char * property_proxy_get_sync_function (const void *parent,
> >> - const char *prefix,
> >> -@@ -136,14 +136,14 @@
> >> - Property *property,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - char * property_proxy_set_sync_function (const void *parent,
> >> - const char *prefix,
> >> - Interface *interface,
> >> - Property *property,
> >> - NihList *prototypes,
> >> - NihList *structs)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - NIH_END_EXTERN
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_main.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_main.c
> >> -@@ -100,10 +100,10 @@
> >> -
> >> - extern char *source_file_path (const void *parent, const char *output_path,
> >> - const char *filename)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> - extern char *header_file_path (const void *parent, const char *output_path,
> >> - const char *filename)
> >> -- __attribute__ ((warn_unused_result, malloc));
> >> -+ __attribute__ ((warn_unused_result));
> >> -
> >> - void
> >> - test_source_file_path (void)
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_object.c
> >> -@@ -12524,6 +12524,7 @@
> >> - dbus_message_iter_init (reply, &iter);
> >> -
> >> - dbus_message_iter_get_basic (&iter, &str_value);
> >> -+ TEST_NE (str_value[0], '\0');
> >> - TEST_TRUE (strchr ("0123456789", str_value[0]));
> >> -
> >> - dbus_message_unref (reply);
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_marshal.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_marshal.c
> >> -@@ -1479,39 +1479,41 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -- "\tDBusMessageIter value_element_iter;\n"
> >> -- "\tconst int16_t * value_element;\n"
> >> -- "\tsize_t value_element_len;\n"
> >> -+ "if (value) {\n"
> >> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -+ "\t\tDBusMessageIter value_element_iter;\n"
> >> -+ "\t\tconst int16_t * value_element;\n"
> >> -+ "\t\tsize_t value_element_len;\n"
> >> - "\n"
> >> -- "\tvalue_element = value[value_i];\n"
> >> -- "\tvalue_element_len = value_len[value_i];\n"
> >> -+ "\t\tvalue_element = value[value_i];\n"
> >> -+ "\t\tvalue_element_len = value_len[value_i];\n"
> >> - "\n"
> >> -
> >> -- "\t/* Marshal an array onto the message */\n"
> >> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal an array onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"n\", &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> >> -- "\t\tint16_t value_element_element;\n"
> >> -+ "\t\tfor (size_t value_element_i = 0; value_element_i < value_element_len; value_element_i++) {\n"
> >> -+ "\t\t\tint16_t value_element_element;\n"
> >> - "\n"
> >> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
> >> -+ "\t\t\tvalue_element_element = value_element[value_element_i];\n"
> >> - "\n"
> >> -- "\t\t/* Marshal a int16_t onto the message */\n"
> >> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> >> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\t/* Marshal a int16_t onto the message */\n"
> >> -+ "\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_INT16, &value_element_element)) {\n"
> >> -+ "\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\t\treturn -1;\n"
> >> -+ "\t\t\t}\n"
> >> -+ "\t\t}\n"
> >> -+ "\n"
> >> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> - "\t\t\treturn -1;\n"
> >> - "\t\t}\n"
> >> -- "\t}\n"
> >> -- "\n"
> >> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -
> >> -+ "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> >> -@@ -1766,15 +1768,17 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -- "\tconst char *value_element;\n"
> >> -+ "if (value) {\n"
> >> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -+ "\t\tconst char *value_element;\n"
> >> - "\n"
> >> -- "\tvalue_element = value[value_i];\n"
> >> -+ "\t\tvalue_element = value[value_i];\n"
> >> - "\n"
> >> -- "\t/* Marshal a char * onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -+ "\t\t/* Marshal a char * onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_iter, DBUS_TYPE_STRING, &value_element)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> -@@ -1933,35 +1937,39 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -- "\tDBusMessageIter value_element_iter;\n"
> >> -- "\tchar * const * value_element;\n"
> >> -+ "if (value) {\n"
> >> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -+ "\t\tDBusMessageIter value_element_iter;\n"
> >> -+ "\t\tchar * const * value_element;\n"
> >> - "\n"
> >> -- "\tvalue_element = value[value_i];\n"
> >> -+ "\t\tvalue_element = value[value_i];\n"
> >> - "\n"
> >> -- "\t/* Marshal an array onto the message */\n"
> >> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -- "\n"
> >> -- "\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> >> -- "\t\tconst char *value_element_element;\n"
> >> -+ "\t\t/* Marshal an array onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_ARRAY, \"s\", &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\t\tvalue_element_element = value_element[value_element_i];\n"
> >> -+ "\t\tif (value_element) {\n"
> >> -+ "\t\t\tfor (size_t value_element_i = 0; value_element[value_element_i]; value_element_i++) {\n"
> >> -+ "\t\t\t\tconst char *value_element_element;\n"
> >> -+ "\n"
> >> -+ "\t\t\t\tvalue_element_element = value_element[value_element_i];\n"
> >> -+ "\n"
> >> -+ "\t\t\t\t/* Marshal a char * onto the message */\n"
> >> -+ "\t\t\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> >> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\t\t\treturn -1;\n"
> >> -+ "\t\t\t\t}\n"
> >> -+ "\t\t\t}\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\t\t/* Marshal a char * onto the message */\n"
> >> -- "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_element)) {\n"
> >> -- "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> - "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> - "\t\t\treturn -1;\n"
> >> - "\t\t}\n"
> >> - "\t}\n"
> >> -- "\n"
> >> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> - "if (! dbus_message_iter_close_container (&iter, &value_iter)) {\n"
> >> -@@ -2194,16 +2202,18 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> >> -- "\tconst char *value_item2_element;\n"
> >> -+ "if (value_item2) {\n"
> >> -+ "\tfor (size_t value_item2_i = 0; value_item2[value_item2_i]; value_item2_i++) {\n"
> >> -+ "\t\tconst char *value_item2_element;\n"
> >> - "\n"
> >> -- "\tvalue_item2_element = value_item2[value_item2_i];\n"
> >> -+ "\t\tvalue_item2_element = value_item2[value_item2_i];\n"
> >> - "\n"
> >> -- "\t/* Marshal a char * onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -+ "\t\t/* Marshal a char * onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_item2_iter, DBUS_TYPE_STRING, &value_item2_element)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_item2_iter);\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> -@@ -2642,41 +2652,43 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -- "\tDBusMessageIter value_element_iter;\n"
> >> -- "\tconst char * value_element_item0;\n"
> >> -- "\tuint32_t value_element_item1;\n"
> >> -- "\tconst MyStructArrayValueElement *value_element;\n"
> >> -+ "if (value) {\n"
> >> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -+ "\t\tDBusMessageIter value_element_iter;\n"
> >> -+ "\t\tconst char * value_element_item0;\n"
> >> -+ "\t\tuint32_t value_element_item1;\n"
> >> -+ "\t\tconst MyStructArrayValueElement *value_element;\n"
> >> - "\n"
> >> -- "\tvalue_element = value[value_i];\n"
> >> -+ "\t\tvalue_element = value[value_i];\n"
> >> - "\n"
> >> -- "\t/* Marshal a structure onto the message */\n"
> >> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a structure onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_STRUCT, NULL, &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tvalue_element_item0 = value_element->item0;\n"
> >> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
> >> - "\n"
> >> -- "\t/* Marshal a char * onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a char * onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tvalue_element_item1 = value_element->item1;\n"
> >> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
> >> - "\n"
> >> -- "\t/* Marshal a uint32_t onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> -@@ -2912,41 +2924,43 @@
> >> - "\treturn -1;\n"
> >> - "}\n"
> >> - "\n"
> >> -- "for (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -- "\tDBusMessageIter value_element_iter;\n"
> >> -- "\tconst char * value_element_item0;\n"
> >> -- "\tuint32_t value_element_item1;\n"
> >> -- "\tconst MyDictEntryArrayValueElement *value_element;\n"
> >> -+ "if (value) {\n"
> >> -+ "\tfor (size_t value_i = 0; value[value_i]; value_i++) {\n"
> >> -+ "\t\tDBusMessageIter value_element_iter;\n"
> >> -+ "\t\tconst char * value_element_item0;\n"
> >> -+ "\t\tuint32_t value_element_item1;\n"
> >> -+ "\t\tconst MyDictEntryArrayValueElement *value_element;\n"
> >> - "\n"
> >> -- "\tvalue_element = value[value_i];\n"
> >> -+ "\t\tvalue_element = value[value_i];\n"
> >> - "\n"
> >> -- "\t/* Marshal a structure onto the message */\n"
> >> -- "\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a structure onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_open_container (&value_iter, DBUS_TYPE_DICT_ENTRY, NULL, &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tvalue_element_item0 = value_element->item0;\n"
> >> -+ "\t\tvalue_element_item0 = value_element->item0;\n"
> >> - "\n"
> >> -- "\t/* Marshal a char * onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a char * onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_STRING, &value_element_item0)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tvalue_element_item1 = value_element->item1;\n"
> >> -+ "\t\tvalue_element_item1 = value_element->item1;\n"
> >> - "\n"
> >> -- "\t/* Marshal a uint32_t onto the message */\n"
> >> -- "\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -- "\t}\n"
> >> -+ "\t\t/* Marshal a uint32_t onto the message */\n"
> >> -+ "\t\tif (! dbus_message_iter_append_basic (&value_element_iter, DBUS_TYPE_UINT32, &value_element_item1)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&value_iter, &value_element_iter);\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\n"
> >> -- "\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -- "\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -- "\t\treturn -1;\n"
> >> -+ "\t\tif (! dbus_message_iter_close_container (&value_iter, &value_element_iter)) {\n"
> >> -+ "\t\t\tdbus_message_iter_abandon_container (&iter, &value_iter);\n"
> >> -+ "\t\t\treturn -1;\n"
> >> -+ "\t\t}\n"
> >> - "\t}\n"
> >> - "}\n"
> >> - "\n"
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_com.netsplit.Nih.Test_proxy.c
> >> -@@ -27359,6 +27359,7 @@
> >> - TEST_TRUE (unix_fd_to_str_replied);
> >> -
> >> - TEST_EQ_P (last_data, parent);
> >> -+ TEST_NE (last_str_value[0], '\0');
> >> - TEST_TRUE (strchr ("0123456789", last_str_value[0]));
> >> - TEST_ALLOC_PARENT (last_str_value, parent);
> >> -
> >> -@@ -27673,6 +27674,7 @@
> >> -
> >> - TEST_EQ (ret, 0);
> >> -
> >> -+ TEST_NE (str_value[0], '\0');
> >> - TEST_TRUE (strchr ("0123456789", str_value[0]));
> >> - TEST_ALLOC_PARENT (str_value, parent);
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/test_property.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/test_property.c
> >> -@@ -8733,7 +8733,7 @@
> >> - TypeVar * var;
> >> - NihListEntry * attrib;
> >> - NihDBusProxy * proxy = NULL;
> >> -- void * parent = NULL;
> >> -+ void * parent __attribute__((unused)) = NULL;
> >> - pid_t pid = -1;
> >> - int status;
> >> - DBusMessage * method_call;
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_standard.c
> >> -@@ -136,17 +136,19 @@
> >> - goto enomem;
> >> - }
> >> -
> >> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -- const char *output_element;
> >> -+ if (output) {
> >> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -+ const char *output_element;
> >> -
> >> -- output_element = output[output_i];
> >> -+ output_element = output[output_i];
> >> -
> >> -- /* Marshal a char * onto the message */
> >> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -- dbus_message_unref (reply);
> >> -- reply = NULL;
> >> -- goto enomem;
> >> -+ /* Marshal a char * onto the message */
> >> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -+ dbus_message_unref (reply);
> >> -+ reply = NULL;
> >> -+ goto enomem;
> >> -+ }
> >> - }
> >> - }
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_standard.c
> >> -@@ -7,7 +7,6 @@
> >> - DBusMessageIter output_iter;
> >> -
> >> - nih_assert (message != NULL);
> >> -- nih_assert (output != NULL);
> >> -
> >> - /* If the sender doesn't care about a reply, don't bother wasting
> >> - * effort constructing and sending one.
> >> -@@ -28,16 +27,18 @@
> >> - return -1;
> >> - }
> >> -
> >> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -- const char *output_element;
> >> --
> >> -- output_element = output[output_i];
> >> --
> >> -- /* Marshal a char * onto the message */
> >> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -- dbus_message_unref (reply);
> >> -- return -1;
> >> -+ if (output) {
> >> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -+ const char *output_element;
> >> -+
> >> -+ output_element = output[output_i];
> >> -+
> >> -+ /* Marshal a char * onto the message */
> >> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -+ dbus_message_unref (reply);
> >> -+ return -1;
> >> -+ }
> >> - }
> >> - }
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_reply_function_deprecated.c
> >> -@@ -7,7 +7,6 @@
> >> - DBusMessageIter output_iter;
> >> -
> >> - nih_assert (message != NULL);
> >> -- nih_assert (output != NULL);
> >> -
> >> - /* If the sender doesn't care about a reply, don't bother wasting
> >> - * effort constructing and sending one.
> >> -@@ -28,16 +27,18 @@
> >> - return -1;
> >> - }
> >> -
> >> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -- const char *output_element;
> >> --
> >> -- output_element = output[output_i];
> >> --
> >> -- /* Marshal a char * onto the message */
> >> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -- dbus_message_unref (reply);
> >> -- return -1;
> >> -+ if (output) {
> >> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -+ const char *output_element;
> >> -+
> >> -+ output_element = output[output_i];
> >> -+
> >> -+ /* Marshal a char * onto the message */
> >> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -+ dbus_message_unref (reply);
> >> -+ return -1;
> >> -+ }
> >> - }
> >> - }
> >> -
> >> ---- libnih-1.0.3.orig/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> >> -+++ libnih-1.0.3/nih-dbus-tool/tests/expected/test_method_object_function_no_input.c
> >> -@@ -88,17 +88,19 @@
> >> - goto enomem;
> >> - }
> >> -
> >> -- for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -- const char *output_element;
> >> -+ if (output) {
> >> -+ for (size_t output_i = 0; output[output_i]; output_i++) {
> >> -+ const char *output_element;
> >> -
> >> -- output_element = output[output_i];
> >> -+ output_element = output[output_i];
> >> -
> >> -- /* Marshal a char * onto the message */
> >> -- if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -- dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -- dbus_message_unref (reply);
> >> -- reply = NULL;
> >> -- goto enomem;
> >> -+ /* Marshal a char * onto the message */
> >> -+ if (! dbus_message_iter_append_basic (&output_iter, DBUS_TYPE_STRING, &output_element)) {
> >> -+ dbus_message_iter_abandon_container (&iter, &output_iter);
> >> -+ dbus_message_unref (reply);
> >> -+ reply = NULL;
> >> -+ goto enomem;
> >> -+ }
> >> - }
> >> - }
> >> -
> >> diff --git a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb b/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> >> deleted file mode 100644
> >> index ff7a4ed10..000000000
> >> --- a/meta-oe/recipes-support/libnih/libnih_1.0.3.bb
> >> +++ /dev/null
> >> @@ -1,48 +0,0 @@
> >> -# Copyright (c) 2013 LG Electronics, Inc.
> >> -
> >> -SUMMARY = "libnih library"
> >> -HOMEPAGE = "https://launchpad.net/libnih"
> >> -DESCRIPTION = "libnih is a small library for C application development \
> >> - containing functions that, despite its name, are not implemented \
> >> - elsewhere in the standard library set. \
> >> - \
> >> - libnih is roughly equivalent to other C libraries such as glib, \
> >> - except that its focus is on a small size and intended for \
> >> - applications that sit very low in the software stack, especially \
> >> - outside of /usr. \
> >> - \
> >> - It expressly does not reimplement functions that already exist in \
> >> - libraries ordinarily shipped in /lib such libc6, and does not do \
> >> - foolish things like invent arbitrary typedefs for perfectly good C types."
> >> -
> >> -SECTION = "libs"
> >> -
> >> -LICENSE = "GPL-2.0"
> >> -LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
> >> -
> >> -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 gettext
> >> -
> >> -do_configure_append () {
> >> - sed -i -e 's,lib/pkgconfig,${baselib}/pkgconfig,g' ${S}/nih/Makefile.in ${S}/nih-dbus/Makefile.in
> >> -}
> >> -
> >> -FILES_${PN}-dev += "${libdir}/pkgconfig/* \
> >> - ${includedir}/* \
> >> - ${libdir}/*.so \
> >> - ${datadir}/* \
> >> - "
> >> -
> >> -# target libnih requires native nih-dbus-tool
> >> -BBCLASSEXTEND = "native"
> >> --
> >> 2.17.1
> >>
> >> --
> >> _______________________________________________
> >> Openembedded-devel mailing list
> >> Openembedded-devel@lists.openembedded.org
> >> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe][PATCH] libnih: Remove
2020-01-09 20:33 [meta-oe][PATCH] libnih: Remove Adrian Bunk
2020-01-09 21:49 ` Khem Raj
@ 2020-01-15 10:15 ` Adrian Bunk
1 sibling, 0 replies; 5+ messages in thread
From: Adrian Bunk @ 2020-01-15 10:15 UTC (permalink / raw)
To: openembedded-devel
ping
Thanks
Adrian
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-01-15 10:15 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-09 20:33 [meta-oe][PATCH] libnih: Remove Adrian Bunk
2020-01-09 21:49 ` Khem Raj
2020-01-09 21:51 ` akuster808
2020-01-09 22:09 ` Khem Raj
2020-01-15 10:15 ` Adrian Bunk
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.