summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Sawicki <p.sawicki2@partner.samsung.com>2017-11-02 10:38:45 +0100
committerPiotr Sawicki <p.sawicki2@partner.samsung.com>2017-11-02 10:38:45 +0100
commit44429cce0568beb59b87fafcf649f00bd4bac5a4 (patch)
tree7f02841215c1b5978906aa3c1e12b2325d16ca27
parent7968b8fcb66be45c6316bd04ae25425740cbacac (diff)
downloadlibgpg-error-44429cce0568beb59b87fafcf649f00bd4bac5a4.tar.gz
libgpg-error-44429cce0568beb59b87fafcf649f00bd4bac5a4.tar.bz2
libgpg-error-44429cce0568beb59b87fafcf649f00bd4bac5a4.zip
Imported Upstream version 1.27upstream/1.27
-rw-r--r--ABOUT-NLS1960
-rw-r--r--AUTHORS81
-rw-r--r--ChangeLog1374
-rw-r--r--Makefile.am35
-rw-r--r--Makefile.in403
-rw-r--r--NEWS379
-rw-r--r--README68
-rw-r--r--THANKS2
-rw-r--r--VERSION2
-rw-r--r--aclocal.m4854
-rw-r--r--autogen.rc2
-rwxr-xr-xautogen.sh138
-rwxr-xr-xbuild-aux/compile2
-rwxr-xr-xbuild-aux/config.guess326
-rwxr-xr-xbuild-aux/config.rpath18
-rwxr-xr-xbuild-aux/config.sub76
-rwxr-xr-xbuild-aux/depcomp40
-rw-r--r--build-aux/ltmain.sh6
-rwxr-xr-xbuild-aux/mdate-sh224
-rwxr-xr-xbuild-aux/missing453
-rw-r--r--build-aux/texinfo.tex8638
-rw-r--r--config.h.in95
-rwxr-xr-xconfigure2234
-rw-r--r--configure.ac373
-rw-r--r--doc/Makefile.am79
-rw-r--r--doc/Makefile.in929
-rw-r--r--doc/errorref.txt1122
-rw-r--r--doc/gpgrt.info1262
-rw-r--r--doc/gpgrt.texi435
-rw-r--r--doc/gpl.texi392
-rw-r--r--doc/lgpl.texi560
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/version.texi4
-rw-r--r--doc/yat2m.c1633
-rw-r--r--lang/Makefile.in283
-rw-r--r--lang/cl/Makefile.in125
-rw-r--r--lang/cl/gpg-error.asd2
-rw-r--r--libgpg-error.spec2
-rw-r--r--m4/Makefile.am2
-rw-r--r--m4/Makefile.in122
-rw-r--r--m4/ac_prog_cc_for_build.m42
-rw-r--r--m4/estream.m449
-rw-r--r--m4/gettext.m496
-rw-r--r--m4/iconv.m4164
-rw-r--r--m4/lib-ld.m487
-rw-r--r--m4/lib-link.m4138
-rw-r--r--m4/lib-prefix.m491
-rw-r--r--m4/libtool.m42
-rw-r--r--m4/nls.m413
-rw-r--r--m4/po.m440
-rw-r--r--m4/progtest.m431
-rw-r--r--m4/threadlib.m42
-rw-r--r--po/LINGUAS5
-rw-r--r--po/Makefile.in.in92
-rw-r--r--po/Makevars37
-rw-r--r--po/Rules-quot15
-rw-r--r--po/cs.gmobin17808 -> 20918 bytes
-rw-r--r--po/cs.po895
-rw-r--r--po/da.gmobin16912 -> 19913 bytes
-rw-r--r--po/da.po897
-rw-r--r--po/de.gmobin18817 -> 29958 bytes
-rw-r--r--po/de.po706
-rw-r--r--po/en@boldquot.header2
-rw-r--r--po/en@quot.header2
-rw-r--r--po/eo.gmobin16376 -> 16383 bytes
-rw-r--r--po/eo.po870
-rw-r--r--po/fr.gmobin18361 -> 21574 bytes
-rw-r--r--po/fr.po904
-rw-r--r--po/hu.gmobin0 -> 17550 bytes
-rw-r--r--po/hu.po1955
-rw-r--r--po/it.gmobin17219 -> 21173 bytes
-rw-r--r--po/it.po949
-rw-r--r--po/ja.gmobin17471 -> 31148 bytes
-rw-r--r--po/ja.po965
-rw-r--r--po/libgpg-error.pot682
-rw-r--r--po/nl.gmobin17547 -> 20617 bytes
-rw-r--r--po/nl.po896
-rw-r--r--po/pl.gmobin18695 -> 28126 bytes
-rw-r--r--po/pl.po724
-rw-r--r--po/pt.gmobin0 -> 21414 bytes
-rw-r--r--po/pt.po1899
-rw-r--r--po/ro.gmobin14347 -> 14526 bytes
-rw-r--r--po/ro.po1131
-rw-r--r--po/ru.gmobin0 -> 35566 bytes
-rw-r--r--po/ru.po1763
-rw-r--r--po/sr.gmobin0 -> 21295 bytes
-rw-r--r--po/sr.po1954
-rw-r--r--po/sv.gmobin16234 -> 16241 bytes
-rw-r--r--po/sv.po867
-rw-r--r--po/uk.gmobin22297 -> 36601 bytes
-rw-r--r--po/uk.po829
-rw-r--r--po/vi.gmobin18368 -> 18375 bytes
-rw-r--r--po/vi.po867
-rw-r--r--po/zh_CN.gmobin11753 -> 11753 bytes
-rw-r--r--po/zh_CN.po865
-rw-r--r--po/zh_TW.gmobin0 -> 19674 bytes
-rw-r--r--po/zh_TW.po1901
-rw-r--r--src/Makefile.am122
-rw-r--r--src/Makefile.in485
-rw-r--r--src/b64dec.c279
-rw-r--r--src/code-from-errno.c10
-rw-r--r--src/code-to-errno.c6
-rw-r--r--src/err-codes.h798
-rw-r--r--src/err-codes.h.in177
-rw-r--r--src/err-sources.h17
-rw-r--r--src/err-sources.h.in2
-rw-r--r--src/estream-printf.c1875
-rw-r--r--src/estream-printf.h151
-rw-r--r--src/estream.c5196
-rw-r--r--src/gen-posix-lock-obj.c88
-rw-r--r--src/gen-w32-lock-obj.c2
-rw-r--r--src/gpg-error.c287
-rw-r--r--src/gpg-error.def.in131
-rw-r--r--src/gpg-error.h754
-rw-r--r--src/gpg-error.h.in654
-rw-r--r--src/gpg-error.m435
-rw-r--r--src/gpg-error.vers135
-rw-r--r--src/gpg-error.w32-manifest.in17
-rw-r--r--src/gpgrt-int.h376
-rw-r--r--src/init.c258
-rw-r--r--src/init.h2
-rw-r--r--src/lock.h4
-rw-r--r--src/mkheader.c237
-rw-r--r--src/mkw32errmap.c2
-rw-r--r--src/posix-lock-obj.h11
-rw-r--r--src/posix-lock.c85
-rw-r--r--src/posix-thread.c30
-rw-r--r--src/strerror.c8
-rw-r--r--src/strsource.c8
-rw-r--r--src/syscfg/lock-obj-pub.aarch64-apple-darwin.h28
-rw-r--r--src/syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h26
-rw-r--r--src/syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.arm-apple-darwin.h26
-rw-r--r--src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h23
-rw-r--r--src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h27
-rw-r--r--src/syscfg/lock-obj-pub.i386-apple-darwin.h26
-rw-r--r--src/syscfg/lock-obj-pub.i686-pc-gnu.h24
-rw-r--r--src/syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.i686-pc-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.mingw32.h18
-rw-r--r--src/syscfg/lock-obj-pub.mips-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h25
-rw-r--r--src/syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h24
-rw-r--r--src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h23
-rw-r--r--src/syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h23
-rw-r--r--src/syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.x86_64-apple-darwin.h28
-rw-r--r--src/syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h25
-rw-r--r--src/syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h24
-rw-r--r--src/syscfg/lock-obj-pub.x86_64-pc-linux-musl.h25
-rw-r--r--src/thread.h4
-rw-r--r--src/version.c6
-rw-r--r--src/versioninfo.rc.in3
-rw-r--r--src/visibility.c732
-rw-r--r--src/visibility.h268
-rw-r--r--src/w32-add.h18
-rw-r--r--src/w32-estream.c1075
-rw-r--r--src/w32-gettext.c31
-rw-r--r--src/w32-iconv.c1793
-rw-r--r--src/w32-lock-obj.h2
-rw-r--r--src/w32-lock.c59
-rw-r--r--src/w32-thread.c26
-rw-r--r--tests/Makefile.am7
-rw-r--r--tests/Makefile.in272
-rw-r--r--tests/t-b64dec.c123
-rw-r--r--tests/t-common.h5
-rw-r--r--tests/t-lock.c26
-rw-r--r--tests/t-poll.c440
-rw-r--r--tests/t-printf.c429
-rw-r--r--tests/t-strerror.c6
-rw-r--r--tests/t-syserror.c9
-rw-r--r--tests/t-version.c4
183 files changed, 60612 insertions, 5871 deletions
diff --git a/ABOUT-NLS b/ABOUT-NLS
index 83bc72e..3b879cb 100644
--- a/ABOUT-NLS
+++ b/ABOUT-NLS
@@ -18,35 +18,7 @@ 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
+1.1 INSTALL Matters
===================
Some packages are "localizable" when properly installed; the programs
@@ -56,36 +28,19 @@ 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:
+provides the GNU `gettext' functions. Installers may use special
+options at configuration time for changing the default behaviour. The
+command:
- ./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.
+will _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.
+probably detect the previously built and installed `libintl' library
+and will decide to use it. If not, you may have to to use the
+`--with-libintl-prefix' option to tell `configure' where to look for it.
Internationalized packages usually have many `po/LL.po' files, where
LL gives an ISO 639 two-letter code identifying the language. Unless
@@ -96,7 +51,7 @@ 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
+1.2 Using This Package
======================
As a user, if your language has been installed for this package, you
@@ -148,7 +103,7 @@ 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
+1.3 Translating Teams
=====================
For the Free Translation Project to be a success, we need interested
@@ -156,7 +111,7 @@ 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.
+`https://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.
@@ -177,859 +132,1118 @@ reach the coordinator for all translator teams.
the terminology in use. Proven linguistic skills are praised more than
programming skills, here.
-1.5 Available Packages
+1.4 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
+matrix shows the current state of internationalization, as of June
+2010. 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
+ Ready PO files af am an ar as ast az be be@latin bg bn_IN bs ca
+--------------------------------------------------+
- Compendium | [] [] [] [] [] |
- a2ps | [] [] [] () |
+ 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 | [] |
+ ant-phone | |
+ anubis | |
+ aspell | [] [] |
+ bash | |
bfd | |
- bibshelf | [] |
+ bibshelf | [] |
binutils | |
- bison | [] [] [] |
- bison-runtime | [] [] [] |
- bluez-pin | [] [] [] |
+ bison | |
+ bison-runtime | [] |
+ bluez-pin | [] [] |
+ bombono-dvd | |
+ buzztard | |
cflow | |
- clisp | [] |
- console-tools | |
- coreutils | [] |
- cpio | [] |
- cpplib | [] |
- cryptonit | [] |
- dialog | [] [] |
- diffutils | [] [] [] |
+ clisp | |
+ coreutils | [] [] |
+ cpio | |
+ cppi | |
+ cpplib | [] |
+ cryptsetup | |
+ dfarc | |
+ dialog | [] [] |
+ dico | |
+ diffutils | [] |
+ dink | |
doodle | |
- e2fsprogs | [] |
- enscript | [] |
- fetchmail | [] [] |
- findutils | [] |
- findutils_stable | [] |
- flex | [] [] |
- fslint | |
+ e2fsprogs | [] |
+ enscript | [] |
+ exif | |
+ fetchmail | [] |
+ findutils | [] |
+ flex | [] |
+ freedink | |
gas | |
- gawk | [] [] |
- gcal | |
+ gawk | [] [] |
+ gcal | [] |
gcc | |
- gettext-examples | [] [] [] |
- gettext-runtime | [] [] [] |
- gettext-tools | [] [] |
- gip | [] [] |
- gliv | [] |
- glunarclock | [] [] |
- gmult | [] [] [] |
+ gettext-examples | [] [] [] [] |
+ gettext-runtime | [] [] |
+ gettext-tools | [] [] |
+ gip | [] |
+ gjay | |
+ gliv | [] |
+ glunarclock | [] [] |
gnubiff | |
- gnucash | () () () |
+ gnucash | [] |
gnuedu | |
- gnulib | [] [] |
+ 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 | [] |
+ gnutls | |
+ gold | |
+ gpe-aerial | |
+ gpe-beam | |
+ gpe-bluetooth | |
+ 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 | |
+ grub | [] [] |
+ gsasl | |
gss | |
- gst-plugins-bad | [] |
- gst-plugins-base | [] |
- gst-plugins-good | [] |
- gst-plugins-ugly | [] |
- gstreamer | [] |
- gtick | [] |
- gtkam | [] [] |
- gtkorphan | [] |
- gtkspell | [] [] |
- gutenprint | [] |
- hello | [] [] [] [] [] [] [] |
- herrie | [] |
+ gst-plugins-bad | [] |
+ gst-plugins-base | [] |
+ gst-plugins-good | [] |
+ gst-plugins-ugly | [] |
+ gstreamer | [] [] [] |
+ gtick | |
+ gtkam | [] |
+ gtkorphan | [] |
+ gtkspell | [] [] [] |
+ gutenprint | |
+ hello | [] |
+ help2man | |
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 | |
+ idutils | |
+ indent | [] [] |
+ iso_15924 | |
+ iso_3166 | [] [] [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_4217 | |
+ iso_639 | [] [] [] [] |
+ iso_639_3 | |
+ jwhois | |
+ kbd | |
+ keytouch | [] |
+ keytouch-editor | |
+ keytouch-keyboa... | [] |
+ klavaro | [] |
+ latrine | |
+ ld | [] |
+ leafpad | [] [] |
+ libc | [] [] |
+ libexif | () |
libextractor | |
- libgpewidget | [] |
+ libgnutls | |
+ libgpewidget | |
libgpg-error | |
- libgphoto2 | [] |
- libgphoto2_port | [] |
- libgsasl | [] |
- libiconv | [] |
- libidn | [] [] |
- lifelines | [] |
- lilypond | [] |
- lingoteach | [] |
+ libgphoto2 | |
+ libgphoto2_port | |
+ libgsasl | |
+ libiconv | [] |
+ libidn | |
+ lifelines | |
+ liferea | [] [] |
+ lilypond | |
+ linkdr | [] |
+ lordsawar | |
lprng | |
- lynx | [] [] |
- m4 | [] [] |
+ lynx | [] |
+ m4 | |
mailfromd | |
mailutils | |
- make | [] [] [] |
+ make | |
man-db | |
- minicom | [] |
- nano | [] [] [] |
- opcodes | [] |
- parted | [] [] |
- pilot-qof | |
- popt | [] [] [] |
- psmisc | [] [] [] |
+ man-db-manpages | |
+ minicom | |
+ mkisofs | |
+ myserver | |
+ nano | [] [] |
+ opcodes | |
+ parted | |
+ pies | |
+ popt | |
+ psmisc | |
+ pspp | [] |
pwdutils | |
- qof | |
- radius | |
- recode | [] |
- rpm | [] [] |
- screem | [] |
- scrollkeeper | [] [] [] [] |
- sed | [] [] |
- shared-mime-info | [] [] [] [] [] [] [] |
- sharutils | [] [] |
+ radius | [] |
+ recode | [] [] |
+ rosegarden | |
+ rpm | |
+ rush | |
+ sarg | |
+ screem | |
+ scrollkeeper | [] [] [] |
+ sed | [] [] |
+ sharutils | [] [] |
shishi | |
skencil | |
- solfege | () () |
+ solfege | |
+ solfege-manual | |
soundtracker | |
- sp | () |
- system-tools-ba... | [] [] [] [] |
- tar | [] [] [] |
- texinfo | [] [] |
+ sp | |
+ sysstat | |
+ tar | [] |
+ texinfo | |
tin | |
- tuxpaint | () [] [] |
unicode-han-tra... | |
unicode-transla... | |
- util-linux | [] [] |
- util-linux-ng | [] [] |
+ util-linux-ng | [] |
+ vice | |
+ vmm | |
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 | [] [] [] |
+ wdiff | |
+ wget | [] [] |
+ wyslij-po | |
+ xchat | [] [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] |
+--------------------------------------------------+
- 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
+ af am an ar as ast az be be@latin bg bn_IN bs ca
+ 6 0 1 2 3 19 1 10 3 28 3 1 38
+
+ crh cs da de el en en_GB en_ZA eo es et eu fa
+ +-------------------------------------------------+
+ a2ps | [] [] [] [] [] [] [] |
+ aegis | [] [] [] |
+ ant-phone | [] () |
+ anubis | [] [] |
+ aspell | [] [] [] [] [] |
+ bash | [] [] [] |
+ bfd | [] |
+ bibshelf | [] [] [] |
+ binutils | [] |
+ bison | [] [] |
+ bison-runtime | [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] |
+ bombono-dvd | [] |
+ buzztard | [] [] [] |
+ cflow | [] [] |
+ clisp | [] [] [] [] |
+ coreutils | [] [] [] [] |
+ cpio | |
+ cppi | |
+ cpplib | [] [] [] |
+ cryptsetup | [] |
+ dfarc | [] [] [] |
+ dialog | [] [] [] [] [] |
+ dico | |
+ diffutils | [] [] [] [] [] [] |
+ dink | [] [] [] |
+ doodle | [] |
+ e2fsprogs | [] [] [] |
+ enscript | [] [] [] |
+ exif | () [] [] |
+ fetchmail | [] [] () [] [] [] |
+ findutils | [] [] [] |
+ flex | [] [] |
+ freedink | [] [] [] |
+ gas | [] |
+ gawk | [] [] [] |
+ gcal | [] |
+ gcc | [] [] |
+ gettext-examples | [] [] [] [] |
+ gettext-runtime | [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gip | [] [] [] [] |
+ gjay | [] |
+ gliv | [] [] [] |
+ glunarclock | [] [] |
+ gnubiff | () |
+ gnucash | [] () () () () |
+ gnuedu | [] [] |
+ gnulib | [] [] |
+ gnunet | |
+ gnunet-gtk | [] |
+ gnutls | [] [] |
+ gold | [] |
+ gpe-aerial | [] [] [] [] |
+ gpe-beam | [] [] [] [] |
+ gpe-bluetooth | [] [] |
+ 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 | [] |
+ grub | [] [] |
+ gsasl | [] |
+ gss | |
+ gst-plugins-bad | [] [] [] [] [] |
+ gst-plugins-base | [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] |
+ gtick | [] () [] |
+ gtkam | [] [] () [] [] |
+ gtkorphan | [] [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] |
+ gutenprint | [] [] [] |
+ hello | [] [] [] [] |
+ help2man | [] |
+ hylafax | [] [] |
+ idutils | [] [] |
+ indent | [] [] [] [] [] [] [] |
+ iso_15924 | [] () [] [] |
+ iso_3166 | [] [] [] [] () [] [] [] () |
+ iso_3166_2 | () |
+ iso_4217 | [] [] [] () [] [] |
+ iso_639 | [] [] [] [] () [] [] |
+ iso_639_3 | [] |
+ jwhois | [] |
+ kbd | [] [] [] [] [] |
+ keytouch | [] [] |
+ keytouch-editor | [] [] |
+ keytouch-keyboa... | [] |
+ klavaro | [] [] [] [] |
+ latrine | [] () |
+ ld | [] [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] |
+ libexif | [] [] () |
+ libextractor | |
+ libgnutls | [] |
+ libgpewidget | [] [] |
+ libgpg-error | [] [] |
+ libgphoto2 | [] () |
+ libgphoto2_port | [] () [] |
+ libgsasl | |
+ libiconv | [] [] [] [] [] |
+ libidn | [] [] [] |
+ lifelines | [] () |
+ liferea | [] [] [] [] [] |
+ lilypond | [] [] [] |
+ linkdr | [] [] [] |
+ lordsawar | [] |
+ lprng | |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailfromd | |
+ mailutils | [] |
+ make | [] [] [] |
+ man-db | |
+ man-db-manpages | |
+ minicom | [] [] [] [] |
+ mkisofs | |
+ myserver | |
+ nano | [] [] [] |
+ opcodes | [] [] |
+ parted | [] [] |
+ pies | |
+ popt | [] [] [] [] [] |
+ psmisc | [] [] [] |
+ pspp | [] |
+ pwdutils | [] |
+ radius | [] |
+ recode | [] [] [] [] [] [] |
+ rosegarden | () () () |
+ rpm | [] [] [] |
+ rush | |
+ sarg | |
+ screem | |
+ scrollkeeper | [] [] [] [] [] |
+ sed | [] [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | |
+ skencil | [] () [] |
+ solfege | [] [] [] |
+ solfege-manual | [] [] |
+ soundtracker | [] [] [] |
+ sp | [] |
+ sysstat | [] [] [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] |
+ tin | [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux-ng | [] [] [] [] |
+ vice | () () |
+ vmm | [] |
+ vorbis-tools | [] [] |
+ wastesedge | [] |
+ wdiff | [] [] |
+ wget | [] [] [] |
+ wyslij-po | |
+ xchat | [] [] [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] [] [] |
+ +-------------------------------------------------+
+ crh cs da de el en en_GB en_ZA eo es et eu fa
+ 5 64 105 117 18 1 8 0 28 89 18 19 0
+
+ fi fr ga gl gu he hi hr hu hy id is it ja ka kn
+ +----------------------------------------------------+
+ a2ps | [] [] [] [] |
+ aegis | [] [] |
+ ant-phone | [] [] |
+ anubis | [] [] [] [] |
+ aspell | [] [] [] [] |
+ bash | [] [] [] [] |
+ bfd | [] [] [] |
+ bibshelf | [] [] [] [] [] |
+ binutils | [] [] [] |
+ bison | [] [] [] [] |
+ bison-runtime | [] [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] [] [] |
+ bombono-dvd | [] |
+ buzztard | [] |
+ cflow | [] [] [] |
+ clisp | [] |
+ coreutils | [] [] [] [] [] |
+ cpio | [] [] [] [] |
+ cppi | [] [] |
+ cpplib | [] [] [] |
+ cryptsetup | [] [] [] |
+ dfarc | [] [] [] |
+ dialog | [] [] [] [] [] [] [] |
+ dico | |
+ diffutils | [] [] [] [] [] [] [] [] [] |
+ dink | [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] |
+ exif | [] [] [] [] [] [] |
+ fetchmail | [] [] [] [] |
+ findutils | [] [] [] [] [] [] |
+ flex | [] [] [] |
+ freedink | [] [] [] |
+ gas | [] [] |
+ gawk | [] [] [] [] () [] |
+ gcal | [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] |
+ gip | [] [] [] [] [] [] |
+ gjay | [] |
+ gliv | [] () |
+ glunarclock | [] [] [] [] |
+ gnubiff | () [] () |
+ gnucash | () () () () () [] |
+ gnuedu | [] [] |
+ gnulib | [] [] [] [] [] [] |
+ gnunet | |
+ gnunet-gtk | [] |
+ gnutls | [] [] |
+ gold | [] [] |
+ gpe-aerial | [] [] [] |
+ gpe-beam | [] [] [] [] |
+ gpe-bluetooth | [] [] [] [] |
+ 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 | [] [] |
+ grub | [] [] [] [] |
+ gsasl | [] [] [] [] [] |
+ gss | [] [] [] [] [] |
+ gst-plugins-bad | [] [] [] [] [] [] |
+ gst-plugins-base | [] [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] |
+ gtick | [] [] [] [] [] |
+ gtkam | [] [] [] [] [] |
+ gtkorphan | [] [] [] |
+ gtkspell | [] [] [] [] [] [] [] [] [] |
+ gutenprint | [] [] [] [] |
+ hello | [] [] [] |
+ help2man | [] [] |
+ hylafax | [] |
+ idutils | [] [] [] [] [] [] |
+ indent | [] [] [] [] [] [] [] [] |
+ iso_15924 | [] () [] [] |
+ iso_3166 | [] () [] [] [] [] [] [] [] [] [] [] |
+ iso_3166_2 | () [] [] [] |
+ iso_4217 | [] () [] [] [] [] |
+ iso_639 | [] () [] [] [] [] [] [] [] |
+ iso_639_3 | () [] [] |
+ jwhois | [] [] [] [] [] |
+ kbd | [] [] |
+ keytouch | [] [] [] [] [] [] |
+ keytouch-editor | [] [] [] [] [] |
+ keytouch-keyboa... | [] [] [] [] [] |
+ klavaro | [] [] |
+ latrine | [] [] [] |
+ ld | [] [] [] [] |
+ leafpad | [] [] [] [] [] [] [] () |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | |
+ libgnutls | [] [] |
+ libgpewidget | [] [] [] [] |
+ libgpg-error | [] [] |
+ libgphoto2 | [] [] [] |
+ libgphoto2_port | [] [] [] |
+ libgsasl | [] [] [] [] [] |
+ libiconv | [] [] [] [] [] [] |
+ libidn | [] [] [] [] |
+ lifelines | () |
+ liferea | [] [] [] [] |
+ lilypond | [] [] |
+ linkdr | [] [] [] [] [] |
+ lordsawar | |
+ lprng | [] |
+ lynx | [] [] [] [] [] |
+ m4 | [] [] [] [] [] [] |
+ mailfromd | |
+ mailutils | [] [] |
+ make | [] [] [] [] [] [] [] [] [] |
+ man-db | [] [] |
+ man-db-manpages | [] |
+ minicom | [] [] [] [] [] |
+ mkisofs | [] [] [] [] |
+ myserver | |
+ nano | [] [] [] [] [] [] |
+ opcodes | [] [] [] [] |
+ parted | [] [] [] [] |
+ pies | |
+ popt | [] [] [] [] [] [] [] [] [] |
+ psmisc | [] [] [] |
+ pspp | |
+ pwdutils | [] [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] [] |
+ rosegarden | () () () () () |
+ rpm | [] [] |
+ rush | |
+ sarg | [] |
+ screem | [] [] |
+ scrollkeeper | [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] |
+ sharutils | [] [] [] [] [] [] [] |
+ shishi | [] |
+ skencil | [] |
+ solfege | [] [] [] [] |
+ solfege-manual | [] [] |
+ soundtracker | [] [] |
+ sp | [] () |
+ sysstat | [] [] [] [] [] |
+ tar | [] [] [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ tin | [] |
+ unicode-han-tra... | |
+ unicode-transla... | [] [] |
+ util-linux-ng | [] [] [] [] [] [] |
+ vice | () () () |
+ vmm | [] |
+ vorbis-tools | [] |
+ wastesedge | () () |
+ wdiff | [] |
+ wget | [] [] [] [] [] [] [] [] |
+ wyslij-po | [] [] [] |
+ xchat | [] [] [] [] [] [] [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] [] |
+ +----------------------------------------------------+
+ fi fr ga gl gu he hi hr hu hy id is it ja ka kn
+ 105 121 53 20 4 8 3 5 53 2 120 5 84 67 0 4
+
+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne
+ +-----------------------------------------------+
+ a2ps | [] |
+ aegis | |
+ ant-phone | |
+ anubis | [] [] |
+ aspell | [] |
+ bash | |
+ bfd | |
+ bibshelf | [] [] |
+ binutils | |
+ bison | [] |
+ bison-runtime | [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] |
+ bombono-dvd | |
+ buzztard | |
+ cflow | |
+ clisp | |
+ coreutils | [] |
+ cpio | |
+ cppi | |
+ cpplib | |
+ cryptsetup | |
+ dfarc | [] |
+ dialog | [] [] [] [] [] |
+ dico | |
+ diffutils | [] [] |
+ dink | |
+ doodle | |
+ e2fsprogs | |
+ enscript | |
+ exif | [] |
+ fetchmail | |
+ findutils | |
+ flex | |
+ freedink | [] |
+ gas | |
+ gawk | |
+ gcal | |
+ gcc | |
+ gettext-examples | [] [] [] [] |
+ gettext-runtime | [] |
+ gettext-tools | [] |
+ gip | [] [] |
+ gjay | |
+ gliv | |
+ glunarclock | [] |
+ gnubiff | |
+ gnucash | () () () () |
+ gnuedu | |
+ gnulib | |
+ gnunet | |
+ gnunet-gtk | |
+ gnutls | [] |
+ gold | |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-bluetooth | [] [] |
+ 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 | |
+ grub | |
+ gsasl | |
+ gss | |
+ gst-plugins-bad | [] [] [] [] |
+ gst-plugins-base | [] [] |
+ gst-plugins-good | [] [] |
+ gst-plugins-ugly | [] [] [] [] [] |
+ gstreamer | |
+ gtick | |
+ gtkam | [] |
+ gtkorphan | [] [] |
+ gtkspell | [] [] [] [] [] [] [] |
+ gutenprint | |
+ hello | [] [] [] |
+ help2man | |
+ hylafax | |
+ idutils | |
+ indent | |
+ iso_15924 | [] [] |
+ iso_3166 | [] [] () [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_4217 | [] [] |
+ iso_639 | [] [] |
+ iso_639_3 | [] |
+ jwhois | [] |
+ kbd | |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ klavaro | [] |
+ latrine | [] |
+ ld | |
+ leafpad | [] [] [] |
+ libc | [] |
+ libexif | |
+ libextractor | |
+ libgnutls | [] |
+ libgpewidget | [] [] |
+ libgpg-error | |
+ libgphoto2 | |
+ libgphoto2_port | |
+ libgsasl | |
+ libiconv | |
+ libidn | |
+ lifelines | |
+ liferea | |
+ lilypond | |
+ linkdr | |
+ lordsawar | |
+ lprng | |
+ lynx | |
+ m4 | |
+ mailfromd | |
+ mailutils | |
+ make | [] |
+ man-db | |
+ man-db-manpages | |
+ minicom | [] |
+ mkisofs | |
+ myserver | |
+ nano | [] [] |
+ opcodes | |
+ parted | |
+ pies | |
+ popt | [] [] [] |
+ psmisc | |
+ pspp | |
+ pwdutils | |
+ radius | |
+ recode | |
+ rosegarden | |
+ rpm | |
+ rush | |
+ sarg | |
+ screem | |
+ scrollkeeper | [] [] |
+ sed | |
+ sharutils | |
+ shishi | |
+ skencil | |
+ solfege | [] |
+ solfege-manual | |
+ soundtracker | |
+ sp | |
+ sysstat | [] |
+ tar | [] |
+ texinfo | [] |
+ tin | |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux-ng | |
+ vice | |
+ vmm | |
+ vorbis-tools | |
+ wastesedge | |
+ wdiff | |
+ wget | [] |
+ wyslij-po | |
+ xchat | [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ +-----------------------------------------------+
+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne
+ 20 5 10 1 13 48 4 2 2 4 24 10 20 3 1
+
+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr
+ +---------------------------------------------------+
+ a2ps | [] [] [] [] [] [] [] [] |
+ aegis | [] [] [] |
+ ant-phone | [] [] |
+ anubis | [] [] [] |
+ aspell | [] [] [] [] [] |
+ bash | [] [] |
+ bfd | [] |
+ bibshelf | [] [] |
+ binutils | [] [] |
+ bison | [] [] [] |
+ bison-runtime | [] [] [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] [] [] |
+ bombono-dvd | [] () |
+ buzztard | [] [] |
+ cflow | [] |
+ clisp | [] [] |
+ coreutils | [] [] [] [] [] [] |
+ cpio | [] [] [] |
+ cppi | [] |
+ cpplib | [] |
+ cryptsetup | [] |
+ dfarc | [] |
+ dialog | [] [] [] [] |
+ dico | [] |
+ diffutils | [] [] [] [] [] [] |
+ dink | () |
+ doodle | [] [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] [] |
+ exif | [] [] [] () [] |
+ fetchmail | [] [] [] [] |
+ findutils | [] [] [] [] [] |
+ flex | [] [] [] [] [] |
+ freedink | [] [] |
+ gas | |
+ gawk | [] [] [] [] |
+ gcal | |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] [] |
+ gip | [] [] [] [] [] |
+ gjay | |
+ gliv | [] [] [] [] [] [] |
+ glunarclock | [] [] [] [] [] |
+ gnubiff | [] () |
+ gnucash | [] () () () |
+ gnuedu | [] |
+ gnulib | [] [] [] [] |
+ gnunet | |
+ gnunet-gtk | |
+ gnutls | [] [] |
+ gold | |
+ gpe-aerial | [] [] [] [] [] [] [] |
+ gpe-beam | [] [] [] [] [] [] [] |
+ gpe-bluetooth | [] [] |
+ 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 | [] [] [] [] |
+ grub | [] [] [] |
+ gsasl | [] [] [] [] |
+ gss | [] [] [] |
+ gst-plugins-bad | [] [] [] [] [] [] |
+ gst-plugins-base | [] [] [] [] [] |
+ gst-plugins-good | [] [] [] [] [] |
+ gst-plugins-ugly | [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] |
+ gtick | [] [] [] |
+ gtkam | [] [] [] [] [] [] |
+ gtkorphan | [] |
+ gtkspell | [] [] [] [] [] [] [] [] [] [] |
+ gutenprint | [] [] |
+ hello | [] [] [] [] |
+ help2man | [] [] |
+ hylafax | [] |
+ idutils | [] [] [] [] [] |
+ indent | [] [] [] [] [] [] [] |
+ iso_15924 | [] [] [] [] |
+ iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] |
+ iso_3166_2 | [] [] [] |
+ iso_4217 | [] [] [] [] [] [] [] [] |
+ iso_639 | [] [] [] [] [] [] [] [] [] |
+ iso_639_3 | [] [] |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ keytouch | [] [] [] |
+ keytouch-editor | [] [] [] |
+ keytouch-keyboa... | [] [] [] |
+ klavaro | [] [] |
+ latrine | [] [] |
+ ld | |
+ leafpad | [] [] [] [] [] [] [] [] [] |
+ libc | [] [] [] [] |
+ libexif | [] [] () [] |
+ libextractor | |
+ libgnutls | [] [] |
+ libgpewidget | [] [] [] |
+ libgpg-error | [] [] |
+ libgphoto2 | [] [] |
+ libgphoto2_port | [] [] [] [] [] |
+ libgsasl | [] [] [] [] [] |
+ libiconv | [] [] [] [] [] |
+ libidn | [] [] |
+ lifelines | [] [] |
+ liferea | [] [] [] [] [] () () [] |
+ lilypond | [] |
+ linkdr | [] [] [] |
+ lordsawar | |
+ lprng | [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailfromd | [] |
+ mailutils | [] |
+ make | [] [] [] [] |
+ man-db | [] [] [] |
+ man-db-manpages | [] [] [] |
+ minicom | [] [] [] [] |
+ mkisofs | [] [] [] |
+ myserver | |
+ nano | [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] [] [] [] |
+ pies | [] |
+ popt | [] [] [] [] |
+ psmisc | [] [] [] |
+ pspp | [] [] |
+ pwdutils | [] |
+ radius | [] [] [] |
+ recode | [] [] [] [] [] [] [] [] |
+ rosegarden | () () |
+ rpm | [] [] [] |
+ rush | [] [] |
+ sarg | |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | [] |
+ skencil | [] [] |
+ solfege | [] [] [] [] |
+ solfege-manual | [] [] [] |
+ soundtracker | [] |
+ sp | |
+ sysstat | [] [] [] [] |
+ tar | [] [] [] [] |
+ texinfo | [] [] [] [] |
+ tin | [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux-ng | [] [] [] [] [] |
+ vice | [] |
+ vmm | [] |
+ vorbis-tools | [] [] |
+ wastesedge | [] |
+ wdiff | [] [] |
+ wget | [] [] [] [] [] [] [] |
+ wyslij-po | [] [] [] |
+ xchat | [] [] [] [] [] [] [] [] [] |
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] |
+ +---------------------------------------------------+
+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr
+ 135 10 4 7 105 1 29 62 47 91 3 54 46 9 37
- tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW
+---------------------------------------------------+
- 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
+ a2ps | [] [] [] [] [] | 27
+ aegis | [] | 9
+ ant-phone | [] [] [] [] | 9
+ anubis | [] [] [] [] | 15
+ aspell | [] [] [] | 20
+ bash | [] [] [] | 12
+ bfd | [] | 6
+ bibshelf | [] [] [] | 16
+ binutils | [] [] | 8
+ bison | [] [] | 12
+ bison-runtime | [] [] [] [] [] [] | 29
+ bluez-pin | [] [] [] [] [] [] [] [] | 37
+ bombono-dvd | [] | 4
+ buzztard | [] | 7
+ cflow | [] [] [] | 9
+ clisp | | 10
+ coreutils | [] [] [] [] | 22
+ cpio | [] [] [] [] [] [] | 13
+ cppi | [] [] | 5
+ cpplib | [] [] [] [] [] [] | 14
+ cryptsetup | [] [] | 7
+ dfarc | [] | 9
+ dialog | [] [] [] [] [] [] [] | 30
+ dico | [] | 2
+ diffutils | [] [] [] [] [] [] | 30
+ dink | | 4
+ doodle | [] [] | 7
+ e2fsprogs | [] [] [] | 11
+ enscript | [] [] [] [] | 17
+ exif | [] [] [] | 16
+ fetchmail | [] [] [] | 17
+ findutils | [] [] [] [] [] | 20
+ flex | [] [] [] [] | 15
+ freedink | [] | 10
+ gas | [] | 4
+ gawk | [] [] [] [] | 18
+ gcal | [] [] | 5
+ gcc | [] [] [] | 7
+ gettext-examples | [] [] [] [] [] [] [] | 34
+ gettext-runtime | [] [] [] [] [] [] [] | 29
+ gettext-tools | [] [] [] [] [] [] | 22
+ gip | [] [] [] [] | 22
+ gjay | [] | 3
+ gliv | [] [] [] | 14
+ glunarclock | [] [] [] [] [] | 19
+ gnubiff | [] [] | 4
+ gnucash | () [] () [] () | 10
+ gnuedu | [] [] | 7
+ gnulib | [] [] [] [] | 16
+ gnunet | [] | 1
+ gnunet-gtk | [] [] [] | 5
+ gnutls | [] [] [] | 10
+ gold | [] | 4
+ gpe-aerial | [] [] [] | 18
+ gpe-beam | [] [] [] | 19
+ gpe-bluetooth | [] [] [] | 13
+ gpe-calendar | [] [] [] [] | 12
+ gpe-clock | [] [] [] [] [] | 28
+ gpe-conf | [] [] [] [] | 20
+ gpe-contacts | [] [] [] | 17
+ gpe-edit | [] [] [] | 12
+ gpe-filemanager | [] [] [] [] | 16
+ gpe-go | [] [] [] [] [] | 25
+ gpe-login | [] [] [] | 11
+ gpe-ownerinfo | [] [] [] [] [] | 25
+ gpe-package | [] [] [] | 13
+ gpe-sketchbook | [] [] [] | 20
+ gpe-su | [] [] [] [] [] | 30
+ gpe-taskmanager | [] [] [] [] [] | 29
+ gpe-timesheet | [] [] [] [] [] | 25
+ gpe-today | [] [] [] [] [] [] | 30
+ gpe-todo | [] [] [] [] | 17
+ gphoto2 | [] [] [] [] [] | 24
+ gprof | [] [] [] | 15
+ gpsdrive | [] [] [] | 11
+ gramadoir | [] [] [] | 11
+ grep | [] [] [] | 10
+ grub | [] [] [] | 14
+ gsasl | [] [] [] [] | 14
+ gss | [] [] [] | 11
+ gst-plugins-bad | [] [] [] [] | 26
+ gst-plugins-base | [] [] [] [] [] | 24
+ gst-plugins-good | [] [] [] [] | 24
+ gst-plugins-ugly | [] [] [] [] [] | 29
+ gstreamer | [] [] [] [] | 22
+ gtick | [] [] [] | 13
+ gtkam | [] [] [] | 20
+ gtkorphan | [] [] [] | 14
+ gtkspell | [] [] [] [] [] [] [] [] [] | 45
+ gutenprint | [] | 10
+ hello | [] [] [] [] [] [] | 21
+ help2man | [] [] | 7
+ hylafax | [] | 5
+ idutils | [] [] [] [] | 17
+ indent | [] [] [] [] [] [] | 30
+ iso_15924 | () [] () [] [] | 16
+ iso_3166 | [] [] () [] [] () [] [] [] () | 53
+ iso_3166_2 | () [] () [] | 9
+ iso_4217 | [] () [] [] () [] [] | 26
+ iso_639 | [] [] [] () [] () [] [] [] [] | 38
+ iso_639_3 | [] () | 8
+ jwhois | [] [] [] [] [] | 16
+ kbd | [] [] [] [] [] | 15
+ keytouch | [] [] [] | 16
+ keytouch-editor | [] [] [] | 14
+ keytouch-keyboa... | [] [] [] | 14
+ klavaro | [] | 11
+ latrine | [] [] [] | 10
+ ld | [] [] [] [] | 11
+ leafpad | [] [] [] [] [] [] | 33
+ libc | [] [] [] [] [] | 21
+ libexif | [] () | 7
+ libextractor | [] | 1
+ libgnutls | [] [] [] | 9
+ libgpewidget | [] [] [] | 14
+ libgpg-error | [] [] [] | 9
+ libgphoto2 | [] [] | 8
+ libgphoto2_port | [] [] [] [] | 14
+ libgsasl | [] [] [] | 13
+ libiconv | [] [] [] [] | 21
+ libidn | () [] [] | 11
+ lifelines | [] | 4
+ liferea | [] [] [] | 21
+ lilypond | [] | 7
+ linkdr | [] [] [] [] [] | 17
+ lordsawar | | 1
+ lprng | [] | 3
+ lynx | [] [] [] [] | 17
+ m4 | [] [] [] [] | 19
+ mailfromd | [] [] | 3
+ mailutils | [] | 5
+ make | [] [] [] [] | 21
+ man-db | [] [] [] | 8
+ man-db-manpages | | 4
+ minicom | [] [] | 16
+ mkisofs | [] [] | 9
+ myserver | | 0
+ nano | [] [] [] [] | 21
+ opcodes | [] [] [] | 11
+ parted | [] [] [] [] [] | 15
+ pies | [] [] | 3
+ popt | [] [] [] [] [] [] | 27
+ psmisc | [] [] | 11
+ pspp | | 4
+ pwdutils | [] [] | 6
+ radius | [] [] | 9
+ recode | [] [] [] [] | 28
+ rosegarden | () | 0
+ rpm | [] [] [] | 11
+ rush | [] [] | 4
+ sarg | | 1
+ screem | [] | 3
+ scrollkeeper | [] [] [] [] [] | 27
+ sed | [] [] [] [] [] | 30
+ sharutils | [] [] [] [] [] | 22
+ shishi | [] | 3
+ skencil | [] [] | 7
+ solfege | [] [] [] [] | 16
+ solfege-manual | [] | 8
+ soundtracker | [] [] [] | 9
+ sp | [] | 3
+ sysstat | [] [] | 15
+ tar | [] [] [] [] [] [] | 23
+ texinfo | [] [] [] [] [] | 17
+ tin | | 4
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
+ util-linux-ng | [] [] [] [] | 20
+ vice | () () | 1
+ vmm | [] | 4
+ vorbis-tools | [] | 6
+ wastesedge | | 2
+ wdiff | [] [] | 7
+ wget | [] [] [] [] [] | 26
+ wyslij-po | [] [] | 8
+ xchat | [] [] [] [] [] [] | 36
+ xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | 63
+ xkeyboard-config | [] [] [] | 22
+---------------------------------------------------+
- 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
+ 85 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW
+ 178 domains 119 1 3 3 0 10 65 51 155 17 98 7 41 2618
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
@@ -1042,12 +1256,12 @@ 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'.
+ If June 2010 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
+`https://translationproject.org/extra/matrix.html'.
-1.6 Using `gettext' in new packages
+1.5 Using `gettext' in new packages
===================================
If you are writing a freely available program and want to
diff --git a/AUTHORS b/AUTHORS
index ae4400f..a8e8abe 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -4,65 +4,54 @@ Bug reports: bug-gnupg@gnupg.org
Mailing list: gnupg-devel@gnupg.org
Security related bug reports: security@gnupg.org
License (library): LGPLv2.1+
-License (tools): GPLv2+ with exception
+License (manual tools): GPLv2+ with exception
+Libgpg-error is free software. See the files COPYING.LIB and COPYING
+for copying conditions. License copyright years may be listed using
+range notation, e.g., 2000-2013, indicating that every year in the
+range, inclusive, is a copyrightable year that would otherwise be
+listed individually.
-Aron Xu <happyaron.xu at gmail.com>
- - TRANSLATION [zh_CN]
-Clytie Siddall <clytie at riverland.net.au>
- - TRANSLATION [vi]
+Authors with a DCO
+==================
-Daniel Nylander <po at danielnylander.se>
- - TRANSLATION [sv]
+We do not collect DCOs for libgpg-error. As a supporting library for
+GnuPG, Libgcrypt, and GPGME a DCO for any of these projects is
+sufficient.
-David Prévot <david at tilapin.org>
- - TRANSLATION [fr]
-Felipe Castro <fefcas at gmail.com>
- - TRANSLATION [eo]
+Translators
+===========
-Francesco Groccia <fgr at anche.no>
- - TRANSLATION [it]
+cs - Petr Pisar <petr.pisar at atlas.cz>
+da - Joe Hansen <joedalton2 at yahoo.dk>
+de - Werner Koch <wk at gnupg.org>
+eo - Felipe Castro <fefcas at gmail.com>
+fr - David Prévot <david at tilapin.org>
+ Stephane Roy <sroy at j2n.net>
+it - Francesco Groccia <fgr at anche.no>
+jp - Takeshi Hamasaki <hmatrjp at users.sourceforge.jp>
+ Yasuaki Taniguchi <yasuakit at gmail.com>
+nl - Freek de Kruijf <f.de.kruijf at gmail.com>
+pl - Jakub Bogusz <qboosh at pld-linux.org>
+ro - Laurentiu Buzdugan <lbuz at rolix.org>
+sv - Daniel Nylander <po at danielnylander.se>
+uk - Yuri Chornoivan <yurchor at ukr.net>
+vi - Clytie Siddall <clytie at riverland.net.au>
+zh_CN - Aron Xu <happyaron.xu at gmail.com>
-Freek de Kruijf <f.de.kruijf at gmail.com>
- - TRANSLATION [nl]
-g10 Code GmbH <code at g10code.com>
- - Design and implementation.
+More credits
+============
-Jakub Bogusz <qboosh at pld-linux.org>
- - TRANSLATION [pl]
+Robert Schiele <rschiele at uni-mannheim.de> wrote libgpg-error.spec.
-Joe Hansen <joedalton2 at yahoo.dk>
- - TRANSLATION [da]
+Thanks to Yukihiro Nakadaira for his public domain iconv
+implementation for Windows.
-Laurentiu Buzdugan <lbuz at rolix.org>
- - TRANSLATION [ro]
-Petr Pisar <petr.pisar at atlas.cz>
- - TRANSLATION [cs]
-
-Robert Schiele <rschiele at uni-mannheim.de>
- - libgpg-error.spec
-
-Stephane Roy <sroy at j2n.net>
- - TRANSLATION [fr]
-
-Takeshi Hamasaki <hmatrjp at users.sourceforge.jp>
- - TRANSLATION [fp]
-
-Werner Koch <wk at gnupg.org>
- - TRANSLATION [de]
-
-Yasuaki Taniguchi <yasuakit at gmail.com>
- - TRANSLATION [fp]
-
-Yuri Chornoivan <yurchor at ukr.net>
- - TRANSLATION [uk]
-
-
- Copyright 2003, 2004, 2005, 2006, 2007, 2013 g10 Code GmbH
+ Copyright 2003-2007, 2013-2017 g10 Code GmbH
This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without
diff --git a/ChangeLog b/ChangeLog
index 18f98c8..8898bc7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,15 +1,1334 @@
+2017-02-28 Werner Koch <wk@gnupg.org>
+
+ Release 1.27.
+ + commit c1668f61c58ea6f0439e5193d83b4e2ac622b286
+ * configure.ac: Bump LT version to C22/A22/R0.
+
+ Add support for armv7-unknown-linux-gnueabihf.
+ + commit 8d45ec8f8f61268a74d9c40b840a8fbd6f805a07
+ * src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabihf.h: Remove.
+ * src/syscfg/lock-obj-pub.armv5-unknown-linux-musleabi.h: Remove.
+ * src/syscfg/lock-obj-pub.armv6-unknown-linux-musleabihf.h: Remove.
+ * src/Makefile.am (lock_obj_pub): Remove them.
+ * src/mkheader.c (canon_host_triplet): Add removed as aliases. Addn
+ alias for armv7-unknown-linux-gnueabihf.
+
+ New public header gpgrt.h as alias for gpg-error.h.
+ + commit 012f1bdc87e9969131c72c5575af0851484a2196
+ * src/gpg-error.h.in (GPGRT_H): New double include protection.
+ * src/Makefile.am (nodist_include_HEADERS): Add gpgrt.h.
+ (BUILT_SOURCES): Ditto.
+ (CLEANFILES): Ditto.
+ (gpgrt.h): New rule.
+
+ tests: New option --debug for t-poll.
+ + commit f141fdee4015d36aec2122853ef55f3ae42197da
+ * tests/t-poll.c (test_poll): Add option.
+
+ Improve tracing of estream.
+ + commit f27e516aabd27afeddecfde197eae1fd21a11395
+ * src/gpgrt-int.h (trace_errno): Add new parameter. Adjust all users.
+ * src/init.c (trace_fp, trace_with_errno, trace_missing_lf)
+ (trace_prefix_done): New vars.
+ (_gpgrt_internal_trace_begin): Add arg WITH_ERRNO. Open a trace file
+ on first use. Init new vars.
+ (print_internal_trace_prefix): New.
+ * src/estream.c, src/w32-estream.c: Improve tracing.
+
+ w32: Fix gpgrt_poll for Windows.
+ + commit 07d5bd918d2185f79c7d61d56ee7f3090b6f5dcd
+ * src/estream.c (_gpgrt_poll) [W32]: Do not call the syscall clamp.
+
+2017-02-27 Werner Koch <wk@gnupg.org>
+
+ Use the new tracing ramework for estream.
+ + commit 84aaa84d41f17d6f5e2bb31930e101568df554e2
+ * src/estream.c: Add trace calls to some functions.
+ * src/w32-estream.c: Replace existing trace calls by the new
+ framework.
+
+ Add a tracing framework.
+ + commit a52f12cc1879d171ddf309b5ac461bab06c8b5e2
+ * src/init.c (trace_save_errno, trace_arg_module)
+ (trace_arg_file, trace_arg_line): New module vars.
+ (do_internal_trace): New.
+ (_gpgrt_internal_trace_printf): New.
+ (_gpgrt_internal_trace): New.
+ (_gpgrt_internal_trace_errno): New.
+ (_gpgrt_internal_trace_end): New.
+ * src/gpgrt-int.h (trace): New macro.
+ (trace_errno): New macro.
+ (trace_start): New macro.
+ (trace_append): New macro.
+ (trace_finish): New macro.
+
+2017-02-26 Werner Koch <wk@gnupg.org>
+
+ Rename internal functions of estream.
+ + commit be49b02a56e8b405eeb0c07c80eb24e71e841b4a
+ * src/estream.c (_gpgrt_es_init): Rename to _gpgrt_estream_init.
+ (es_fill): Rename to fill_stream.
+ (es_fflush): Rename to flush_stream.
+ (es_deinitialize): Rename to deinit_stream_obj.
+ (es_create): Rename to create_stream
+ (es_read_nbf): Rename to do_read_nbf.
+ (es_read_lbf): Rename to do_read_lbf.
+ (es_read_fbf): Rename to do_read_fbf.
+ (es_peek): Rename to peek_stream.
+ (es_skip): Rename to skip_stream.
+ (es_print): Rename to do_print_stream.
+
+2017-02-24 Werner Koch <wk@gnupg.org>
+
+ w32: Do not use the syscall clamps in pollable mode.
+ + commit 915e1bf2ad1b23239b17843755376344e59a3110
+ * src/estream.c (estream_cookie_w32): Add flag no_syscall_clamp.
+ (func_w32_create): Add arg no_syscall_clamp.
+ (func_w32_read): Do not call pre/post_syscall_clamp when flag is set.
+ (func_w32_write): Ditto.
+ (func_w32_seek): Ditto.
+ (do_w32open): Set NO_SYSCALL_CLAMP in pollable mode.
+ (es_create) [W32]: Make sure that pollable-mode is unly used with the
+ W32 backend.
+
+2017-02-23 Werner Koch <wk@gnupg.org>
+
+ w32: Replace gpgrt locks in w32-streams by native critical sections.
+ + commit c9e44c92e08187626e878d826cdedf4cd4e931fe
+ * src/w32-estream.c (TRACE_ERR): Also print the error number. This is
+ in particular useful on non-english systems.
+ (reader_context_s, writer_context_s): Replace the gpgrt mutex by a
+ native critical section. Change all calls to gpgrt_lock_ fucntions by
+ the EnterCriticalSection et al.
+ (_gpgrt_w32_poll): Make CODE unsigned which is what WFMO returns.
+ Remove the then useless condition.
+
+2017-02-19 Werner Koch <wk@gnupg.org>
+
+ New error code GPG_ERR_INV_NAME.
+ + commit 3a2ee6df5911728938a2fb56237b08f790841a0c
+
+
+2017-02-02 NIIBE Yutaka <gniibe@fsij.org>
+
+ syscfg: Add a sh3 architecture.
+ + commit 67e51f9957f875ca854f25f4a9a63aeb831c55c4
+ * src/syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h: New.
+ * src/Makefile.am (lock_obj_pub): Add it.
+
+2017-02-01 NIIBE Yutaka <gniibe@fsij.org>
+
+ Add Base64 decoder.
+ + commit 4bfc2117b70415a5c5d3f0a0ac9086e168350d83
+ * NEWS: Add interface changes.
+ * src/Makefile.am (libgpg_error_la_SOURCES): Add b64dec.c.
+ * src/b64dec.c: New. Taken from gpgme. Prefix function names with
+ _gpgrt_. Change API a bit, not exposing the structure.
+ * src/gpg-error.def.in: Export Base64 functions.
+ * src/gpg-error.vers: Likewise.
+ * src/visibility.c, src/visibility.h: Likewise.
+ * src/gpg-error.h.in: Add Base64 struct and functions.
+ * src/gpgrt-int.h: Add Base64 internal functions.
+ * tests/Makefile.am (TESTS): Add t-b64dec.
+ * tests/t-b64dec.c: New.
+
+2017-01-19 Werner Koch <wk@gnupg.org>
+
+ estream: Correctly set ERRNO to EOPNOTSUPP.
+ + commit 55c497904dd0794ca5cfcafe369943736b0d4e62
+ * src/estream.c (es_flush, es_write_nbf): Fix setting of ERRNO to
+ EOPNOTSUPP.
+
+2017-01-17 Werner Koch <wk@gnupg.org>
+
+ build: Modernize autogen.sh.
+ + commit 66275ac5b8db9d83a72b5497eec4e6d9ac3b4e65
+ * autogen.sh: Update from GnuPG.
+ * autogen.rc (version_parts): New.
+ * configure.ac: Change to use autogen.sh --find-version helper.
+ * Makefile.am (dist-hook): Do not create VERSION
+ (EXTRA_DIST): Add VERSION.
+
+2017-01-10 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ doc,configure: Be consistent about preferring --with-libgpg-error-prefix
+ + commit 19de4cef279272d3969e36dd8cd2fa05a7bf5276
+ * doc/gpgrt.texi: Say "--with-libgpg-error-prefix" instead of
+ "--with-gpg-error-prefix".
+ * src/gpg-error.m4: When warning about library locations, warn with
+ the preferred "--with-libgpg-error-prefix" name.
+
+2017-01-03 Werner Koch <wk@gnupg.org>
+
+ Fix macro GPGRT_GCC_VERSION.
+ + commit 704c31992e8716bbe61e6d5751e125a64badeef0
+ * src/gpg-error.h.in (GPGRT_GCC_VERSION): Fix.
+
+2016-12-21 Werner Koch <wk@gnupg.org>
+
+ Release 1.26.
+ + commit 82266defa39901ec9f97533623af5638a35e5a77
+ * configure.ac: Bump LT version to C21/A21/R0.
+
+2016-12-13 Werner Koch <wk@gnupg.org>
+
+ New error code GPG_ERR_TRY_LATER.
+ + commit f02a657f0129b30700b2f36956ee37b40cc2da82
+
+
+2016-12-12 Werner Koch <wk@gnupg.org>
+
+ New error code GPG_ERR_DNS_TIMEOUT.
+ + commit 90b4dfad438900c7808b8c2995ba984fa3587bb2
+
+
+ New error codes to support libdns.
+ + commit 56ab574c28586fccd95a08acdc9ee4962ab0db50
+
+
+2016-12-02 Werner Koch <wk@gnupg.org>
+
+ Fix NULL segv in new option --desc.
+ + commit 140a19617c78d5f0e2ac8d7e2c8e7092862ec2fb
+ * src/gpg-error.c (print_desc): Shortcur for unknown symbols.
+
+ New error code GPG_ERR_INV_FLAG.
+ + commit c761c981b38741421d13bb7102b1ea7625d2d639
+
+
+ New option --desc for gpg-error.
+ + commit b462d603f5110842489edce9e01e4ea40ac05cba
+ * doc/errorref.txt: Remove all tabs.
+ * doc/Makefile.am (install-data-local): New to install errorref.txt.
+ (uninstall-local): New.
+ (errorref.txt.x): New.
+ * src/Makefile.am (gpg_error_CPPFLAGS): Define PKGDATADIR
+ * src/gpg-error.c (print_desc): New.
+ (show_usage): New.
+ (main): Improve option parser. Add new option --desc. Call
+ print_desc.
+
+2016-11-17 NIIBE Yutaka <gniibe@fsij.org>
+
+ Fix EXEEXT for lock obj creation.
+ + commit eeef6b8724b43e105ae2beef022fc957eb228bcf
+ * src/Makefile.am (lock-obj-pub.native.h): Add EXEEXT for
+ the executable gen-posix-lock-obj.
+
+2016-11-14 Werner Koch <wk@gnupg.org>
+
+ Release 1.25.
+ + commit 6d834f817fdb741ec64dcfbd2166ea044e4e0c3d
+ * configure.ac: Set LT version to C20/A20/R0.
+
+ po: Update German translation.
+ + commit 9cecc8ccded0759d94b08c9859e7ea843430dd97
+
+
+ Fix typo in two new error descriptions.
+ + commit 80350f97e9e811b9e77b59b8fc4172043f072f42
+
+
+2016-11-12 Justus Winter <justus@g10code.com>
+
+ estream: Support 'es_poll' on Windows.
+ + commit 40e5ff0a0084c0d9521b401db4f38885bfdae233
+ * src/Makefile.am (arch_sources): Add new file.
+ * src/estream.c (O_NONBLOCK): Move to 'gpgrt-int.h'.
+ (BUFFER_BLOCK_SIZE): Likewise.
+ (BUFFER_UNREAD_SIZE): Likewise.
+ (struct notify_list_s, notify_list_t): Likewise.
+ (struct _gpgrt_stream_internal, estream_internal_t): Likewise.
+ (X_POLLABLE): New macro.
+ (parse_mode): Parse keyword 'pollable', emulate O_NONBLOCK using the
+ same mechanism on Windows.
+ (_gpgrt_poll): Use the new '_gpgrt_w32_poll' on Windows.
+ * src/gpgrt-int.h (_gpgrt_functions_w32_pollable): New declaration.
+ (_gpgrt_w32_pollable_create): New prototype.
+ (_gpgrt_w32_poll): Likewise.
+ * src/w32-estream.c: New file. This code is adapted from GPGME.
+ * tests/t-poll.c (create_pipe): Create pollable streams.
+
+ estream: Track the kind of backend used.
+ + commit e15416d3668ea9dcc6a64cbb98140a99be8a7865
+ * src/estream.c (struct _gpgrt_stream_internal): Add 'kind'.
+ (init_stream_obj): New parameter 'kind', initialize field.
+ (es_create): New parameter 'kind'. Update all callers.
+ * src/gpgrt-int.h (gpgrt_stream_backend_kind_t): New type.
+
+ estream: Rework how the cookie functions are handled.
+ + commit a0651e910f962a49b0b7f7942512f17a5fe39a7d
+ * src/estream.c (cookie_ioctl_function_t): Move to 'gpgrt-int.h',
+ along with the macros for the IOCTL numbers.
+ (estream_functions_mem): Use the new type and add the ioctl function.
+ (estream_functions_fd): Likewise.
+ (estream_functions_w32): Likewise.
+ (estream_functions_fp): Likewise.
+ (init_stream_object): Use the new type, and also initialize
+ 'func_ioctl'.
+ (es_create): Use the new type.
+ (_gpgrt_fopen): Adapt.
+ (_gpgrt_mopen): Likewise.
+ (_gpgrt_fopenmem): Likewise.
+ (_gpgrt_fopencookie): Likewise.
+ (_gpgrt_fdopen): Likewise.
+ (_gpgrt_fpopen): Likewise.
+ (do_w32open): Likewise.
+ * src/gpgrt-int.h (struct cookie_io_functions_s): New type.
+
+ estream: Rework modestring handling.
+ + commit 135319b5d1f9a88187687646c762759cfa05a7ec
+ * src/estream.c (X_SAMETHREAD, X_SYSOPEN): New macros.
+ (parse_mode): Rework how information flows from here to 'es_create'.
+ Instead of using an integer flag per mode, use flags.
+ (init_stream_obj): Adapt accordingly.
+ (es_create): Likewise.
+ (_gpgrt_fopen): Likewise.
+ (_gpgrt_mopen): Likewise.
+ (_gpgrt_fopenmem): Likewise.
+ (_gpgrt_fopencookie): Likewise.
+ (_gpgrt_fdopen): Likewise.
+ (_gpgrt_fpopen): Likewise.
+ (do_w32open): Likewise.
+ (_gpgrt_freopen): Likewise.
+
+2016-11-12 Werner Koch <wk@gnupg.org>
+
+ Add new interface gpgrt_get_syscall_clamp.
+ + commit b7972767513c8748096ebed78d1e1621bd2bd459
+ * src/visibility.c (gpgrt_get_syscall_clamp): New.
+ * src/gpg-error.vers, src/gpg-error.def.in: Add function.
+ * src/gpg-error.h.in: Ditto.
+ * src/estream.c (_gpgrt_get_syscall_clamp): New.
+
+2016-11-11 Werner Koch <wk@gnupg.org>
+
+ Use the syscall clamp functions also for lock functions.
+ + commit 25d463c67821901c8fd6736c815f11e85bbae66f
+ * src/posix-lock.c (pre_lock_func, post_lock_func): New.
+ (_gpgrt_lock_set_lock_clamp): New.
+ (_gpgrt_lock_lock): Use clamp functions.
+ * src/w32-lock.c (pre_lock_func, post_lock_func): New.
+ (_gpgrt_lock_set_lock_clamp): New.
+ (_gpgrt_lock_lock): Use clamp functions.
+ * src/posix-lock.c (pre_syscall_func, post_syscall_func): New.
+ (_gpgrt_thread_set_syscall_clamp): New.
+ (_gpgrt_yield): Use clamp functions.
+ * src/w32-lock.c (pre_syscall_func, post_syscall_func): New.
+ (_gpgrt_thread_set_syscall_clamp): New.
+ (_gpgrt_yield): Use clamp functions.
+ * src/estream.c: Include lock.h and thread.h.
+ (do_deinit): Call _gpgrt_lock_set_lock_clamp.
+ (_gpgrt_set_syscall_clamp): Ditto.
+
+2016-11-11 Andre Heinecke <aheinecke@intevation.de>
+
+ w32: Fix lock c++ narrowing conversion warning.
+ + commit b1ccab5bf8e1206aae1307ad5d23890be4251c8f
+ * src/syscfg/lock-obj-pub.mingw32.h (gpgrt_lock_t): Declare priv as
+ unsigned char.
+
+2016-11-10 Werner Koch <wk@gnupg.org>
+
+ Change description of GPG_ERR_OPEN_KEYRING.
+ + commit bae57a21cfab25ad11c82dc6e69d82d1f2f7a415
+
+
+2016-11-02 Werner Koch <wk@gnupg.org>
+
+ Add error codes GPG_ERR_TOO_YOUNG and GPG_ERR_TOO_OLD.
+ + commit 49e32eed4550869644d706352d683ddba5696d4e
+
+
+2016-10-18 Justus Winter <justus@g10code.com>
+
+ estream: Fix modestring parsing.
+ + commit 0734f4863859257d18ca96f4b9be62be75fcffe1
+ * src/estream.c (parse_mode): Fix parsing the 'sysopen' flag.
+
+2016-10-07 Werner Koch <wk@gnupg.org>
+
+ Add error code USER_ID_EXISTS, NAME_EXISTS, and DUP_NAME.
+ + commit 0c837a82207d0b19f9dabc8870ffb23d6a4ade64
+
+
+2016-09-01 Werner Koch <wk@gnupg.org>
+
+ Check the size of the time_t.
+ + commit bf7eb978597ba07906f0a7490e626c071af1987f
+ * configure.ac (AC_HEADER_TIME): New.
+ (AC_CHECK_SIZEOF): Check size of time_t.
+
+ Add error WINDOW_TOO_SMALL, WINDOW_TOO_LARGE, and MISSING_ENVVAR.
+ + commit bc3e817bd7e671975f94bae20cbbf9a91fe3353b
+
+
+2016-08-16 Werner Koch <wk@gnupg.org>
+
+ New error code GPG_ERR_ENGINE_TOO_OLD.
+ + commit b2640cb1f7b3b056ea4f8fe4b79d58fcd10ef93b
+
+
+2016-07-14 Werner Koch <wk@gnupg.org>
+
+ Release 1.24.
+ + commit bb1269c85bb41dbb6391756a65e8bc357d82d6b6
+
+
+2016-07-13 Werner Koch <wk@gnupg.org>
+
+ build: Update config.{guess,sub} to {2016-05-15,2016-06-20}.
+ + commit 387eeb5d5b57e4390c4eaf101bb5cf9cf3cbd4ba
+ * build-aux/config.guess: Update.
+ * build-aux/config.sub: Update.
+
+2016-07-12 Yann E. MORIN <yann.morin.1998@free.fr>
+
+ Add an option to disable tests.
+ + commit d57a16c3779eca84dedcf2423b26e41172cd5a96
+ * configure.ac: add an option to enable/disable building tests
+ * Makefile.am: conditionally build tests
+
+ Fix build without threads.
+ + commit abcdfa7964da62b92984516608faf8941038b71d
+ * src/gen-posix-lock-obj.c: properly guard inclusioin of pthread.h
+ * tests/t-lock.c: likewise
+ * tests/t-poll.c: likewise
+
+2016-07-05 Andre Heinecke <aheinecke@intevation.de>
+
+ Define EWOULDBLOCK in case it is not defined.
+ + commit 65e967627b3d60f550c7d302227dcf9f797e437f
+ * src/estream.c (EWOULDBLOCK): Define fallback.
+
+2016-07-02 Werner Koch <wk@gnupg.org>
+
+ yat2m: Fix table formatting.
+ + commit 1a53a0ac4cc241a5c6d360d6259dd04afc09264c
+ * doc/yat2m.c (proc_texi_cmd): Use .TQ for @itemx. Print a .P at the
+ end of a level 0 table.
+
+2016-06-27 Werner Koch <wk@gnupg.org>
+
+ estream: Fix bug es_fclose_snatch if a seek has been used.
+ + commit 467ccbb6062439eda9dce7cd991934d1a5491713
+ * src/estream.c (func_mem_ioctl): Set LEN from DATA_LEN.
+
+2016-06-25 Werner Koch <wk@gnupg.org>
+
+ w32: Silence compiler warnings about redefined macros.
+ + commit 7213299fdb2293b974fc436686626ae0a29290b8
+ * src/estream.c (S_IRGRP) [W32]: Protect against redefinition.
+
+ doc: Update yat2m.c.
+ + commit 9b5e3d1608922f4aaf9958e022431849d5a58501
+ * doc/yat2m.c: Update from gnupg.
+
+2016-06-24 Werner Koch <wk@gnupg.org>
+
+ estream: Remove two compiler warning.
+ + commit 0982a72ecc8e7738ec968b3a6710bdacb0f2da4e
+ * src/estream.c (func_file_create): Remove dead assignment.
+ (doreadline): Do not decrement SPACE_LEFT before breaking the loop.
+ Add an extra block to limit the scope of that variable.
+
+2016-06-15 Werner Koch <wk@gnupg.org>
+
+ Release 1.23.
+ + commit e444cacc74c488063336c196f0c01e98f67cf999
+
+
+ po: Update German translation.
+ + commit d878afa4b884149dca587131bdf5b6d8f96227fa
+
+
+2016-06-15 Jakub Bogusz <qboosh@pld-linux.org>
+
+ po: Update Polish translation.
+ + commit b908104846a71cf8ae3d3323be6bbc6edcef6ee0
+
+
+2016-06-15 Werner Koch <wk@gnupg.org>
+
+ tests: Fix rare deadlock condition in t-poll.
+ + commit 7ed150201cc5058650cf9673a4e53720a37841c8
+ * tests/t-poll.c (launch_thread): Use es_fileno before starting the
+ thread.
+
+2016-06-15 NIIBE Yutaka <gniibe@fsij.org>
+
+ estream: Fix assertion failure due to es_flush.
+ + commit 28fd0ab40739e8cb73f208e30f78d8aa7a0a6d19
+ * src/estream.c (es_writen): Set writing flag even if no data was
+ written.
+
+2016-06-15 Werner Koch <wk@gnupg.org>
+
+ Adjust memory limit of es_fopenmem to the block size.
+ + commit baf4bcc0973c8b04bd760aaab0f4232c9354e203
+ * src/estream.c (func_mem_create): Round up memory limit.
+
+2016-05-17 Werner Koch <wk@gnupg.org>
+
+ Add GPG_ERR_SUBKEYS_EXP_OR_REV.
+ + commit 1ee822f9ff73a9a302ad0eb298640797d735e62b
+
+
+2016-05-07 Werner Koch <wk@gnupg.org>
+
+ syscfg: Add a powerpc and a tilgegx architecture.
+ + commit dfcd58fd3f58e548062b91bd6e20e27cbf4da18d
+ * src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h: New.
+ * src/syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h: New.
+ * src/Makefile.am (lock_obj_pub): Add them.
+
+2016-04-25 Werner Koch <wk@gnupg.org>
+
+ Release 1.22.
+ + commit 9a05076e90eef504cbc3ef614982f856b9b60540
+ * configure.ac: Set LT version to C18/A18/R0.
+
+ build: Update config.{guess,sub} to 2016-04-02 and 2016-03-30.
+ + commit 8ae3af15caaaaffaa9dbeab5fd767076891200bb
+ * build-aux/config.guess: Update.
+ * build-aux/config.sub: Update.
+
+2016-04-25 NIIBE Yutaka <gniibe@fsij.org>
+
+ Fix for HPPA.
+ + commit f1104b92249005a31961d1a32c38ba65a0b3ff3a
+ * configure.ac (HAVE_GCC_ATTRIBUTE_ALIGNED): Revert.
+ * src/gen-posix-lock-obj.c (USE_16BYTE_ALIGNMENT): Revert.
+ * src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h: Revert.
+
+2016-04-21 Werner Koch <wk@gnupg.org>
+
+ w32: Add iconv functions.
+ + commit 1cd1ddb4ac2c13223a073f6d77696bcd6253e2ff
+ * src/w32-add.h (gpgrt_w32_iconv_t): New.
+ (gpgrt_w32_iconv_open, gpgrt_w32_iconv_close, gpgrt_w32_iconv): New.
+ ( GPGRT_ENABLE_W32_ICONV_MACROS): New
+ * src/w32-iconv.c: Change license to LGPLv2.1+. Dispable mlang
+ feature. Remove external DLL loading. Simplify iconv functions. Use
+ cleaner context struct pattern. Use gpgrt namespace.
+ * src/gpg-error.def.in: Add new functions.
+
+2016-04-05 Werner Koch <wk@gnupg.org>
+
+ estream,w32: Temporary fix for gpgrt_poll.
+ + commit 4354720ab3631dfd2811d881566b10a72c8f2165
+ * src/estream.c (_gpgrt_poll) [W32]: Do not use FD_ISSET.
+
+2016-03-29 Werner Koch <wk@gnupg.org>
+
+ estream: Prepare for new mode flag "sysopen".
+ + commit 5d1adaa5fd12f65f49abeb99e5ae7226ec27ba0e
+ * src/estream.c (parse_mode): Add arg "sysopen". Adjust all callers.
+
+ estream: Use simpler names for static functions.
+ + commit de0618d5c64e02b9b3a568fc859d9edcb4ab35ba
+ * src/estream.c: Replace all es_func_* to just func_*.
+
+ estream: Remove strange macro for better readability.
+ + commit 217a451d54186283f09af5b3c03933f214ddf1c0
+ * src/estream.c (SET_UNLESS_NONZERO): Remove macro.
+ (es_deinitialize): Replace that macro by direct code.
+
+2016-03-24 Peter Wu <peter@lekensteyn.nl>
+
+ Add function gpgrt_annotate_leaked_object.
+ + commit 52c3606b2384f33ef30ea5ada3f187829de9dcf7
+ * src/gpg-error.h.in: add gpgrt_annotate_leaked_object to support
+ marking memory as non-leaked for Clang and GCC.
+
+2016-03-14 Kylie McClain <somasis@exherbo.org>
+
+ syscfg: Add lock-obj-pub files for {armv5, armv6, x86_64}-musl targets.
+ + commit 140cfd51cee738a55caf9d347981f6f81e1990a4
+ * src/syscfg/lock-obj-pub.armv5-unknown-linux-musleabi.h: New.
+ * src/syscfg/lock-obj-pub.armv6-unknown-linux-musleabihf.h New.
+ * src/syscfg/lock-obj-pub.x86_64-pc-linux-musl.h: New.
+ * src/Makefile.am (lock_obj_pub): Add files.
+
+2016-03-04 NIIBE Yutaka <gniibe@fsij.org>
+
+ Fix detecting Solaris operating system.
+ + commit f7a77c5c236ecec846de9be46703026f9b01008f
+ * src/gen-posix-lock-obj.c (USE_DOUBLE_FOR_ALIGNMENT): Check for
+ the macro __sun.
+
+ For Solaris, add -lrt correctly.
+ + commit f9fc565129293f47cbfe4da48fcd6099e9ce5508
+ * configure.ac (LIB_SCHED_YIELD): Not avoiding defining LIB.
+
+2016-03-01 NIIBE Yutaka <gniibe@fsij.org>
+
+ Fix for Solaris.
+ + commit 34b07146bbb0863436fc9381a84314b18bdfb807
+ * src/gen-posix-lock-obj.c (USE_DOUBLE_FOR_ALIGNMENT): Check LP64.
+
+2016-02-26 NIIBE Yutaka <gniibe@fsij.org>
+
+ po: Update Japanese translation.
+ + commit 49655fb6ef39b307787e1b6e00c996f9c7db64f7
+
+
+ Add support for Solaris, fixing HPPA.
+ + commit 5168b97fb5e2eebdc99b40f96f9b6289647e87d2
+ * configure.ac (HAVE_GCC_ATTRIBUTE_ALIGNED): Remove.
+ (LIB_SCHED_YIELD): New. Check sched_yield in -lrt.
+ * src/gen-posix-lock-obj.c (USE_16BYTE_ALIGNMENT): Remove.
+ (USE_DOUBLE_FOR_ALIGNMENT, USE_LONG_DOUBLE_FOR_ALIGNMENT): New.
+ * src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h: Update.
+
+2016-02-08 Werner Koch <wk@gnupg.org>
+
+ build: Create an SWDB file during "make distcheck"
+ + commit 1e6c5a70b3b51f81d2fc1289129f6c3e1920ebcc
+ * Makefile.am (distcheck-hook): New.
+
+2016-01-19 Werner Koch <wk@gnupg.org>
+
+ Add GPG_ERR_DB_CORRUPTED.
+ + commit b3bb6e2cc31208a198e74b42ca495c08ebb00fc4
+
+
+2016-01-13 Marek Vasut <marex@denx.de>
+
+ Add new lock-obj-pub for NIOS2.
+ + commit 71370060aae7a83f4d6c3b9c924f204a57cc2538
+ src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h: New.
+
+2015-12-14 NIIBE Yutaka <gniibe@fsij.org>
+
+ po: Update Japanese translation.
+ + commit 1814a9bdc15f00bcf6b13ad16857a4f4922fa1d7
+
+
+2015-12-12 Werner Koch <wk@gnupg.org>
+
+ Release 1.21.
+ + commit 425b7687b4f74a22b0aa760262cb8f13ae40dc26
+ * configure.ac: Set LT version to C17/A17/Ro.
+
+2015-12-07 Andre Heinecke <aheinecke@intevation.de>
+
+ Fix windows 8bit encoding conversion.
+ + commit 823e858cdf5eb6b9945a46478f9876819c16bcd3
+ * src/w32-gettext.c (wchar_to_native): Convert to ConsoleOutputCP.
+
+2015-12-03 Justus Winter <justus@g10code.com>
+
+ tests: Fix read past buffer.
+ + commit 68827cbba2083db40df92de1bc449a3d2d0e81ed
+ * tests/t-poll.c (test_poll): Fix read past buffer.
+
+2015-11-19 Justus Winter <justus@g10code.com>
+
+ Avoid 'malloc' corner case.
+ + commit 06af687beaa1f8e72a05bd3a057b73fecb158c3d
+ * src/init.c (_gpgrt_realloc): Avoid calling 'malloc(0)'.
+
+2015-10-21 Werner Koch <wk@gnupg.org>
+
+ Add error codes NO_NAME, NO_KEY, and SERVER_FAILURE.
+ + commit a144fa8863846dc3f6d34731741cd63251620837
+
+
+2015-10-18 Werner Koch <wk@gnupg.org>
+
+ estream: Avoid calling write(fd,NULL,n).
+ + commit 75172adc3b103bd7ef75575a0c0c9c3b63fa4023
+ * src/estream.c (es_func_fd_write): Take care of a flush requests.
+ (es_func_w32_write): Ditto.
+ (es_func_fp_write): Ditto.
+
+2015-09-28 Werner Koch <wk@gnupg.org>
+
+ estream: Keep track of EPIPE.
+ + commit c09997bc50f3fffaf76d60d2e571b1d85536571e
+ * src/estream.c (_gpgrt_stream_internal): Add indicators.hup.
+ (init_stream_obj): Init it.
+ (es_fill, es_flush, es_seek): Set that.
+ (_gpgrt_poll): Set event.
+
+ Add GPG_ERR_FALSE and GPG_ERR_TRUE error codes.
+ + commit d3e9514ff82ff767fc78ce485aef71ba56f3c0d5
+
+
+2015-09-25 Werner Koch <wk@gnupg.org>
+
+ estream: Add gpgrt_set_nonblock and gpgrt_poll.
+ + commit 071c2170479869f4c6694ae85d2b113e84482a01
+ * configure.ac (AC_CHECK_HEADERS): Add sys/select.h and sys/time.h.
+ * src/estream.c: Include both header if available.
+ (COOKIE_IOCTL_NONBLOCK): New.
+ (struct estream_cookie_fd): Add field nonblock.
+ (func_fd_create): Set nonblock from MODEFLAGS.
+ (es_func_fd_ioctl): New.
+ (parse_mode): Add modeflag "nonblock".
+ (es_fill): Map EWOULDBLOCK to EAGAIN. Do not set error indicator for
+ EAGAIN.
+ (es_flush, es_seek, es_write_nbf): Map EWOULDBLOCK to EAGAIN.
+ (do_fdopen): Call COOKIE_IOCTL_NONBLOCK.
+ (_gpgrt_set_nonblock): New.
+ (_gpgrt_get_nonblock): New.
+ (_gpgrt_poll): New.
+
+ * src/gpg-error.h.in (struct _gpgrt_poll_s): New.
+ (gpgrt_poll_t, es_poll_t): New.
+ (es_set_nonblock, es_get_nonblock, es_poll): New.
+
+ * src/gpg-error.vers, src/gpg-error.def.in: Add gpgrt_set_nonblock,
+ gpgrt_get_nonblock, and gpgrt_poll.
+ * src/visibility.c (gpgrt_set_nonblock, gpgrt_get_nonblock): New.
+ (gpgrt_poll): New.
+
+ * tests/t-common.h (DIM): New.
+ * tests/t-poll.c: New.
+ * tests/Makefile.am (TESTS): Add t-poll.
+ (t_poll_LDADD): New.
+
+2015-09-24 Werner Koch <wk@gnupg.org>
+
+ estream: Replace indicator help functions to ease code reading.
+ + commit 61d832c53b7db5367a5542347e3454c882d0bf28
+ * src/estream.c (es_set_indicators, es_get_indicator): Remove and
+ change callers to set/get indicators directly.
+
+2015-09-17 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Support i[456]86-pc{,-linux,-kfreebsd}-gnu.h.
+ + commit 9decdd7bd105ff6a0973cc1f6652e0eb0625d640
+ * src/mkheader (canon_host_triplet): Add new entries.
+ * src/syscfg/lock-obj-pub.i486-pc-gnu.h: Rename to ...
+ * src/syscfg/lock-obj-pub.i686-pc-gnu.h: this.
+ * src/syscfg/lock-obj-pub.i486-pc-kfreebsd-gnu.h: Rename to ...
+ * src/syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h: this.
+ * src/syscfg/lock-obj-pub.i486-pc-linux-gnu.h: Remove.
+ * src/Makefile.am (lock_obj_pub): Update.
+
+2015-08-26 Werner Koch <wk@gnupg.org>
+
+ Release 1.20.
+ + commit 44caed05ec146654f1ce40bba4b25def83c369db
+ * configure.ac: Set LT version to C16/A16/R0.
+
+ Add new version macros.
+ + commit 030ee30c4ae85f2f41ca77651e4a7d7c9993e284
+ * src/gpg-error.h.in (GPGRT_VERSION): New.
+ (GPGRT_VERSION_NUMBER): New.
+ (GPG_ERROR_VERSION, GPG_ERROR_VERSION_NUMBER): Move to top of file.
+
+ Add macro GPGRT_INLINE and avoid -Wundef warnings.
+ + commit 9cd3f002addf2acae4a7b0f52f8941e517e83d73
+ * src/gpg-error.h.in (GPG_ERR_INLINE): Use #if defined for possible
+ undefined macros to avoid warnign with GCC's -Wundef option.
+ (GPGRT_INLINE): New.
+
+2015-08-26 Yuri Chornoivan <yurchor@ukr.net>
+
+ Update Ukrainian translation.
+ + commit 17e4f727d9bd8e406bf977af445ef57201d23249
+
+
+2015-08-25 Werner Koch <wk@gnupg.org>
+
+ Make configure option --disable-build-timestamp the default.
+ + commit d328c4d72fa6d224117d7332082509c240a4f2fc
+ * configure.ac (BUILD_TIMESTAMP): Set to "<none>" by default.
+
+ w32: Make sure the setmode is called.
+ + commit 1e8d00260a97e0213559c74f687e478e7479a0ea
+ * src/estream.c (HAVE_DOSISH_SYSTEM): Define if needed.
+
+2015-07-27 Werner Koch <wk@gnupg.org>
+
+ Add option --lib-version to the gpg-error tool.
+ + commit d2e4bb4c77167a1ed10f1017a7d06a822bbd5135
+ * src/gpg-error.c (main): Add new option.
+
+2015-07-24 Werner Koch <wk@gnupg.org>
+
+ Add new public macros for GCC attributes.
+ + commit 4e790613f66efcfc62d73722d5f1730a37cb8324
+ * src/gpg-error.h.in (GPGRT_GCC_VERSION): New.
+ (GPGRT_ATTR_NORETURN, GPGRT_ATTR_PRINTF, GPGRT_ATTR_NR_PRINTF): New.
+ (GPGRT_ATTR_FORMAT_ARG, GPGRT_ATTR_SENTINEL): New.
+ (GPGRT_ATTR_USED, GPGRT_ATTR_UNUSED, GPGRT_ATTR_DEPRECATED): New.
+ (GPGRT_ATTR_PURE, GPGRT_ATTR_MALLOC): New.
+ (GPGRT_HAVE_MACRO_FUNCTION, GPGRT_HAVE_PRAGMA_GCC_PUSH): New.
+ (_GPGRT_GCC_A_PRINTF): Replace GPGRT_ATTR_PRINTF.
+
+2015-06-15 Werner Koch <wk@gnupg.org>
+
+ Allow building with --disable-threads.
+ + commit 13918d05a333255d22aa6718dd467fcb8eaf80c8
+ * src/posix-lock-obj.h (LOCK_ABI_NOT_AVAILABLE): New.
+ (LOCK_ABI_VERSION): Define depending on USE_POSIX_THREADS.
+ (_gpgrt_lock_t) [!USE_POSIX_THREADS]: Do not define the union.
+ * src/gen-posix-lock-obj.c: Take care of USE_POSIX_THREADS.
+ * src/posix-lock.c (_gpgrt_lock_init, _gpgrt_lock_lock)
+ (_gpgrt_lock_trylock, _gpgrt_lock_unlock)
+ (_gpgrt_lock_destroy): Return success for a no-threads version.
+ * tests/t-lock.c: Disable tests if threads are not available.
+ * src/mkheader.c (main): Add NO-THREADS to the printed comment.
+ * configure.ac: Show NO-TRHEADS in the final summary.
+
+2015-04-14 NIIBE Yutaka <gniibe@fsij.org>
+
+ po: Update Japanese translation.
+ + commit 4171d61a97d9628532db84b590a9c135f360fa90
+
+
+2015-04-10 Werner Koch <wk@gnupg.org>
+
+ Release 1.19.
+ + commit d77c33ae608d67086ea057cca5ddee99a7202f8b
+
+
+ po: Update German translation.
+ + commit e43045fe63aed0aba6522ebfd6e336b03f250069
+
+
+ w32: Remove compiler warnings.
+ + commit eaec10f48803ee2232d1c1515fbe8f485c1e84b0
+ * src/Makefile.am (pre_mkheader_cmds): Avoid make diagnostic about
+ failed but ignored command. This confuses Emacs' compiler job parser.
+ * tests/t-lock.c [W32]: Include time.h.
+ * src/init.c: Reorganize Windows only code.
+ (wchar_to_utf8, utf8_to_wchar): Remove unused functions.
+ (_gpg_err_set_errno): Use only one copy for all platforms.
+
+2015-03-24 Werner Koch <wk@gnupg.org>
+
+ Use assert to print diagnosicts before calling abort.
+ + commit 56feff58d4fab92701ae77a1004af820b85e7f6c
+ * src/posix-lock.c: Add assert calls.
+
+2015-03-24 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Avoid breakage with gcc 5.
+ + commit c01c8f0c4f55d76b037c7f6aa44ad25ede18d38a
+ * src/Makefile.am: Add -P to the C preprocessor when building
+ mkerrcodes.h, to avoid a noisy intermediate pipeline.
+
+2015-03-19 Werner Koch <wk@gnupg.org>
+
+ Add option --defines to gpg-error.
+ + commit 528ee704f8f9d881ba370dcbfa9194d6704f9a2f
+ * src/gpg-error.c (main): Add option --help and --defines.
+
+ Add GPG_ERR_LDAP_* error codes.
+ + commit dc95f1ea1ab902b9f49de651084f514535e4a3fc
+ * src/err-codes.h.in: Add error codes.
+ * doc/ldap2gpgerr.c: New.
+
+2015-03-16 Werner Koch <wk@gnupg.org>
+
+ Remove useless conditions.
+ + commit b5cb32f979a80904ea58fc7531e43e2be2270573
+ * src/estream.c (fname_set_internal): Remove useless condition.
+ * src/mkheader.c (main): Ditto.
+
+2015-03-06 Werner Koch <wk@gnupg.org>
+
+ Add host-triplet aliasing feature to mkheader.
+ + commit 4441e96801fdc4c900abae8c0aa0b53e2e26e079
+ * src/Makefile.am (lock_obj_pub): Rename i586-pc-linux-gnu to
+ i686-pc-linux-gnu. Remove i486-pc-linux-gnu.
+ * src/mkheader.c (canon_host_triplet): New.
+ (main): Use it.
+
+ w32: Add a manifest to libgpg-error.
+ + commit 0f814d4c4a285573eef2391c70e21cf8126cafcb
+ * src/gpg-error.w32-manifest.in: New.
+ * src/Makefile.am (EXTRA_DIST): Add it.
+ (versioninfo.lo): Depend on it.
+ * src/versioninfo.rc.in: Add it.
+ * configure.ac (AC_CONFIG_FILES): Add it.
+ (BUILD_VERSION): New.
+
+2015-02-18 Neal H. Walfield <neal@gnu.org>
+
+ Correct URL.
+ + commit b400d7c65daaf44f227073ddde7d06986afde786
+
+
+2015-01-30 Werner Koch <wk@gnupg.org>
+
+ w32: Use -static-libgcc to avoid linking to libgcc_s_sjlj-1.dll.
+ + commit 8487ec25e1c8f73ca7dc31e5d648cb05eede0f14
+ * src/Makefile.am (extra_ltoptions): New.
+ (libgpg_error_la_LDFLAGS): Use it.
+
+2015-01-26 Werner Koch <wk@gnupg.org>
+
+ Release 1.18.
+ + commit f79688532f100599b1e24dde1429a229524601c9
+ * configure.ac: Set LT version to C14/A14/R0.
+
+ po: Update German translation.
+ + commit 83c0bd462b45ddb75da8c2778ba1fb0c210b53ff
+
+
+2015-01-22 Werner Koch <wk@gnupg.org>
+
+ Add GPG_ERR_LEGACY_KEY.
+ + commit 524d5bdee2954337e748428469972957663d497d
+
+
+2015-01-05 Werner Koch <wk@gnupg.org>
+
+ Avoid false warning about uninitialized var.
+ + commit 46aaffbe852e334fd1a72affc4a918ceb7dc457b
+ * src/gpg-error.c (get_err_from_str): Init SAVED_CHAR.
+
+ build: Update to gettext 0.19.
+ + commit abe43b5cbf066086deb735bba37178b34f12a4cb
+ * po/Makefile.in.in (MSGMERGE): Remove --previous.
+ * po/Makevars (MSGMERGE_OPTIONS): Add --previous.
+
+ build: Require automake 1.14.
+ + commit 3d32de205211ca91d21941273db306a759ccc3ba
+ * configure.ac (AM_INIT_AUTOMAKE): Add serial-tests.
+ * tests/Makefile.am (INCLUDES): Replace by AM_CPPFLAGS.
+
+2014-12-28 Werner Koch <wk@gnupg.org>
+
+ Add GPG_ERR_REQUEST_TOO_SHORT and GPG_ERR_REQUEST_TOO_LONG.
+ + commit a672a1510456f3f12769938ab95c50ec6904e42e
+
+
+2014-12-15 Werner Koch <wk@gnupg.org>
+
+ Fix commit 754a987.
+ + commit bcd9295d5b9c9f46478bff0680f57bd71b4061f8
+ * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New.
+ (AUTOMAKE_OPTIONS): Move options to ...
+ * configure.ac (AM_INIT_AUTOMAKE): .. here.
+ (BUILD_DOC): Fix commit 754a987.
+
+ Add configure option --disable-doc.
+ + commit 754a987f6df59e2ba0e69aada65ae4aaf593c148
+ * Makefile.am (doc) [!BUILD_DOC]: Do not recurse into doc/.
+ * configure.ac (BUILD_DOC): New am_conditional and new option.
+
+ Add GPG_ERR_OBJ_TERM_STATE.
+ + commit 923c4b174520c401a827d8198ebd2dc83666000f
+
+
+2014-12-03 Werner Koch <wk@gnupg.org>
+
+ Add GPG_ERR_FORBIDDEN.
+ + commit 149fe98e1279b065edb06958d9a73a0c013c2db9
+
+
+2014-11-26 МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>
+
+ po: Add Serbian translation.
+ + commit 210126d38096e764dd3a82da45f8b5f66309ecd5
+
+
+2014-10-25 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Add new lock-obj-pub for mips64el-unknown-linux-gnuabi64.
+ + commit a186f35d05575d6d653e5bebb2dd169d9444af18
+ * src/syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h: New.
+ * src/Makefile.am (lock_obj_pub): Add.
+
+2014-10-23 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ add lock-obj header for or1k-unknown-linux-gnu.
+ + commit c143fa81462584ad39ea780908266bce3fb9a49e
+ * src/syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h: new
+
+ add lock-obj for new arch triplet for x86.
+ + commit d85af2fbac956eb2a8630d1c17b53a7a8760d7a4
+ * src/sysconfig/lock-obj-pub.i586-pc-linux-gnu.h: New.
+
+2014-10-15 Werner Koch <wk@gnupg.org>
+
+ Release 1.17.
+ + commit 1d9e4c29fc23da64f964ed3337cd18429e1a2964
+ * configure.ac: Set LT version to C13/A13/R0.
+
+ doc: Add a man page for gpg-error-config.
+ + commit 9d9c25f6d76f1287f193f170ae5534f1ac346db0
+ * doc/gpgrt.texi: New. Just a start for now.
+ * doc/gpl.texi, doc/lgpl.texi: New. Take from Libgcrypt.
+ * doc/yat2m.c: New. Take from GnuPG master.
+ * doc/Makefile.am: New.
+ * configure.ac (AC_CONFIG_FILES): Add doc/Makefile.
+ * Makefile.am (SUBDIRS): Add doc/.
+ * build-aux/mdate-sh, build-aux/texinfo.tex: New.
+
+ Fix to help building native on Windows.
+ + commit 7285a27a7985c10f6778c67b31dd501e6594cb44
+ * configure.ac (FORCE_USE_SYSCFG): New am_conditional.
+ * src/Makefile.am: Use new conditional to decide whether to build the
+ native lock object header.
+
+2014-10-03 Werner Koch <wk@gnupg.org>
+
+ Change gpgrt_pending{,_unlocked} to macros.
+ + commit 12b5188bd495e45775c34c8e6263e6be177c03da
+ * src/gpg-error.h.in (gpgrt_pending): Change to a macro.
+ (gpgrt_pending_unlocked): Change to a macro.
+ (_gpgrt_pending, _gpgrt_pending_unlocked): New private functions.
+ * src/visibility.c, src/visibility.h: Change accordingly.
+ * src/gpg-error.vers, src/gpg-error.def.in: Ditto.
+ * src/estream.c (_gpgrt_pending_unlocked): Rename to
+ _gpgrt__pending_unlocked.
+ (_gpgrt_pending): Rename to _gpgrt__pending.
+
+2014-10-02 Werner Koch <wk@gnupg.org>
+
+ w32: Make it build again.
+ + commit e8b04bed1093a9f1d87c150326e79adfeb02e2b4
+ * src/estream.c (es_func_w32_read): Fix var name.
+
+ build: Support SYSROOT based config script finding.
+ + commit 3ecdcb6ac814e3b63aebbf66729ae6cb67c9f6d2
+ * src/gpg-error.m4: Add support for SYSROOT and set
+ gpg_config_script_warn. Use AC_PATH_PROG instead of AC_PATH_TOOL
+ because the config script is not expected to be installed with a
+ prefix for its name.
+
+ Add GPG_ERR_BOGUS_STRING and an experimental gpgrt_pending.
+ + commit 74abfcf0c3ba7cd6ce36540c70699fc1719248b3
+ * src/visibility.c (gpgrt_pending, gpgrt_pending_unlocked): New.
+ * src/estream.c (_gpgrt_pending, _gpgrt_pending_unlocked): New.
+ (check_pending): new.
+ (check_pending_fbf, check_pending_nbf): New.
+ (es_func_mem_read, es_func_fd_read, es_func_w32_read)
+ (es_func_fp_read, es_fill): Take care of the special 0 value for SIZE.
+
+2014-09-29 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ GNU calls little-endian powerpc64 powerpc64le, not powerpc64el.
+ + commit d2757001c5719ca8c8bd6aa2e2e2d9a299fb76c6
+ * src/Makefile.am (lock_obj_pub): fix powerpc64el to powerpc64le
+ * src/sysconfig/lock-obj-pub.powerpc64el-unknown-linux-gnu.h : move to
+ src/sysconfig/lock-obj-pub.powerpc64le-unknown-linux-gnu.h
+
+2014-09-29 Werner Koch <wk@gnupg.org>
+
+ Add error codes for use by a TLS library.
+ + commit d58fa35e89feddb71feeba8e39a016cd37c4be29
+
+
+2014-09-24 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Allow ./configure to explicitly set libgpg-error's build timestamp.
+ + commit d620005fd1a655d591fccb44639e22ea445e4554
+ * configure.ac: add --enable-build-timestamp
+
+2014-09-24 Werner Koch <wk@gnupg.org>
+
+ Add new error source GPG_ERR_SOURCE_TLS.
+ + commit efb2442458c8dd8d5af5a533dc09370b54f5f86f
+
+
+2014-09-23 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Add new lock-obj-pub for sparc64-unknown-linux-gnu.
+ + commit f227618e9e0d01e9dd1afbd91f9a509a532717eb
+ * src/syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h: New.
+ * src/Makefile.am (lock_obj_pub): Add.
+
+ Add new lock-obj-pub for powerpc64el-unknown-linux-gnu.
+ + commit 33e5504fbb5e5e2ff44023c0a22dfb668ff8b10f
+ * src/syscfg/lock-obj-pub.powerpc64el-unknown-linux-gnu.h: New.
+ * src/Makefile.am (lock_obj_pub): Add.
+
+2014-09-18 Werner Koch <wk@gnupg.org>
+
+ Release 1.16.
+ + commit 8f3187fe56cb8e535e3ceff75fdd4e128070af57
+ * configure.ac: Set LT version to C12/A12/R2.
+
+ Add new lock-obj-pub for Apple iOS.
+ + commit cc4b0caa57a595a3727e51e061c519232f7bdb05
+ * src/syscfg/lock-obj-pub.aarch64-apple-darwin.h: New.
+ * src/syscfg/lock-obj-pub.arm-apple-darwin.h: New.
+
+2014-09-12 Werner Koch <wk@gnupg.org>
+
+ Fix es_fclose for streams opened with "samethread".
+ + commit c307e1f801cd9a25c4a5b9a90073362219d52ee6
+ * src/estream.c (destroy_stream_lock): New.
+ (es_create, do_close): Use new wrapper function.
+
+ Fix a prototype.
+ + commit e1882ee8c541020ec590bf096508ca5b6d2ab944
+ * src/gpgrt-int.h: s/off_t/gpgrt_off_t/.
+
+2014-09-11 Werner Koch <wk@gnupg.org>
+
+ Release 1.15.
+ + commit 6ebcd696fdbc0485099fba987c0c302cb46dd116
+ * configure.ac: Set LT version to C12/A12/R1.
+
+ Fix build problems with non-gmake (ie. AIX).
+ + commit 316171204d9a995f8b85431830bbc225ea144b48
+ * src/Makefile.am: Do not distribute gpg-error.h.
+ (lock-obj-pub.native.h): Prepend a "./" to match the dependency.
+
+ Fix problems with ssize_t and off_t.
+ + commit 5a4684f3b0db4cd5c13f94b1319c245ef96ce91d
+ * configure.ac (AC_SYS_LARGEFILE): New.
+ (AC_CHECK_HEADERS): Check for stdint.h.
+ (AC_CHECK_SIZEOF): Add for int, long and long long.
+ (REPLACEMENT_FOR_OFF_T): New ac_define.
+ * src/mkheader.c (have_stdint_h, have_w32_system, have_w64_system)
+ (replacement_for_off_type, stdint_h_included): New.
+ (xfree, xstrdup): New.
+ (parse_config_h): New.
+ (write_special): Support "define:gpgrt_off_t", "define:gpgrt_ssize_t",
+ "api_ssize_t" tags.
+ (main): Add config.h arg. Call parse_config_h. Fix substitute code.
+ * src/Makefile.am (gpg-error.h): Pass config.h to mkheader.
+
+ * src/gpg-error.h.in: Include definitions for gpgrt_ssize_t and
+ gpgrt_off_t. Let mkheader insert ssize_t keywords. Chnage all off_t
+ to gpgrt_off_t.
+ * src/estream.c: Change all off_t to gpgrt_off_t. Chnage all ssize_t
+ to gpgrt_ssize_t.
+ * src/visibility.c (gpgrt_fseeko): Use gpgrt_off_t.
+ (gpgrt_ftello): Ditto.
+ (gpgrt_getline): Use gpgrt_ssize_t.
+ (gpgrt_read_line): Ditto.
+
+ Fix compiler warning for w32.
+ + commit 4138644d74f127c1f4abf7455fe1e21f56d6e07e
+ * src/syscfg/lock-obj-pub.mingw32.h (GPGRT_LOCK_INITIALIZER): Add
+ mssing braces.
+
+2014-09-08 Werner Koch <wk@gnupg.org>
+
+ Release 1.14.
+ + commit 25f312dbb82722d23ad9faed8341923af6d3663c
+ * configure.ac: Set LT version to C12/A12/R0.
+
+ po: Update de.po.
+ + commit 2ff05feae6c5090081612a7d9a787298f37d46a2
+
+
+2014-08-26 Werner Koch <wk@gnupg.org>
+
+ Add gpgrt_set_alloc_func.
+ + commit 7fdca61bcf60e730177889fbbd2f935ba33ae0c3
+ * src/visibility.c (gpgrt_set_alloc_func): New.
+ * configure.ac (_ESTREAM_PRINTF_REALLOC): Define.
+ (_ESTREAM_PRINTF_EXTRA_INCLUDE): Define.
+ * src/estream.c (mem_alloc, mem_realloc, mem_free): Simplify.
+ (_gpgrt_free): Remove.
+ * src/init.c (custom_realloc): New var.
+ (_gpgrt_set_alloc_func): New.
+ (_gpgrt_realloc, _gpgrt_malloc, _gpgrt_free): New.
+
+ * src/visibility.h (gpg_err_deinit): Mark as visible.
+
+ Export missing init functions.
+ + commit d9d5b61a9f70556e8fc0775f1501380f65ce9502
+ * src/gpg-error.h.in (gpgrt_init): New macro.
+ (gpgrt_check_version): New prototype.
+ * src/init.c (_gpg_err_init): Rename from gpg_err_init.
+ (_gpg_err_deinit): Rename from gpg_err_deinit.
+ * src/visibility.c (gpg_err_init): New.
+ (gpg_err_deinit): New.
+ (gpgrt_check_version): New.
+ * src/gpg-error.vers (gpg_err_init, gpg_err_deinit): Add missing
+ symbols.
+ (gpgrt_check_version): New.
+ * src/gpg-error.def.in (gpg_err_init, gpg_err_deinit): Add missing
+ symbols.
+ (gpgrt_check_version): New.
+ * src/gpg-error.c (main): Use gpgrt_init macro.
+
+ Include required headers into gpg-error.h.
+ + commit 320f1b864553f105217ad6b0c70598f9a48c6aaa
+ * src/gpg-error.h.in: Include stdarg.h.
+
+2014-08-25 Werner Koch <wk@gnupg.org>
+
+ Replace locking code in estream functions.
+ + commit fc651665010056e6184e8514e5c5436427d7052d
+ * src/posix-lock.c: Add weak program for pthread_mutex_trylock.
+ (_gpgrt_lock_trylock): New.
+ * src/w32-lock.c (_gpgrt_lock_init): Add missing return statement.
+ (_gpgrt_lock_trylock): New.
+ * src/visibility.c (gpgrt_set_syscall_clamp): New.
+ (gpgrt_lock_trylock): New.
+ (gpgrt_vsnprintf): Fix symbol name.
+ * src/init.c (DllMain): Mark unused arg.
+ * src/estream.c: Replace npth mutexes by our own locks. Replace yeild
+ macro by _gpgrt_yield.
+ (pre_syscall_func, post_syscall_func): New.
+ (do_deinit): Clear both new vars.
+ (es_func_fd_read, es_func_fd_write): Call pre and post syscall
+ functions instead of the former SYSCALL macros.
+ (es_func_w32_read, es_func_w32_write): Ditto.
+ (es_func_fd_seek, es_func_w32_seek, es_func_fp_read)
+ (es_func_fp_write, es_func_fp_seek, es_func_fp_destroy): Bracket
+ syscalls with the pre- and post-syscall fucntions.
+ (do_npth_read, do_npth_write): Remove.
+ (_gpgrt_es_init): Remove call to mutex init. It is now statically
+ initialized.
+ (_gpgrt_set_syscall_clamp): New.
+ (es_create): Destroy stream lock on error.
+ (do_close): Destroy stream lock.
+
+ Remove GnuPG specific code.
+ + commit 98781deb0b1787fd7eaabee27ef6a06d37195267
+ * src/estream.c (es_write_sanitized_utf8_buffer): Remove.
+
+ Add test for the estream printf functions.
+ + commit ce31fe792b5f8adf81710c1bf5986cd10636e16b
+ * tests/t-printf.c: New.
+ * configure.ac: Check for vasprintf.
+
+ Add gpgrt_snprintf and gpgrt_vsnprintf.
+ + commit 8a5f2680daa5ea0280ef195efe3050df7bb06e78
+
+
+ Finish inclusion of estream into the API.
+ + commit e5304d2c8aaaf1682707caa5694316640a18de57
+
+
+ Implement symbol visibility.
+ + commit 216e7def2118a1774fa7ebeb45b8635b9fe6ba42
+ * configure.ac: New option --enable-ld-version-script.
+ (GPGRT_USE_VISIBILITY): New ac_define.
+ (HAVE_LD_VERSION_SCRIPT): New am_conditional.
+ * src/gpg-error.vers: New.
+ * src/gpgrt-int.h: New.
+ * src/visibility.c, src/visibility.h: New. Lot of changes to symbold
+ names.
+
+ First set of changes to include estream into the API.
+ + commit 6714d41af5b3f4d447eb0caea0ede38b753397f8
+ * configure.ac (AH_BOTTOM): Define GPGRT_ENABLE_ES_MACROS.
+ * src/gpg-error.h.in: include stdio.h. Include most of the estream
+ functions and rename structures and types.
+ * src/estream.h: Rewrite. Include only gpg-error.h and local
+ prototypes.
+ * src/estream.c: Rename types and macros.
+ * src/estream-printf.c (_gpgrt_estream_snprintf): Prefix public
+ functions with _gpgrt_.
+
+ Fix some minor estream things.
+ + commit 8d57ce619aa49862caeee30181fbbd9c76846554
+ * m4/estream.m4: Check for memrchr.
+ * src/estream.c (memrchr) [!HAVE_MEMRCHR]: New.
+ * src/init.c: Include estream.h
+ (real_init): Init estream.
+
+ Add missing redefine macros to cleanup the external symbols.
+ + commit b84c1ee0d637108a74066e0da50cb132273020e9
+
+
+ Add estream code from GnuPG.
+ + commit 2b74237d19e44f7173bb052677f0ec35e6ff51b0
+ * src/estream-printf.c, src/estream-printf.h: New.
+ * src/estream.c, src/estream.h: New.
+ * m4/estream.m4: New.
+ * src/Makefile.am (libgpg_error_la_SOURCES): Add new files.
+ * configure.ac (AH_BOTTOM): Define estream prefix.
+ <gcc>: Add useful gcc warning options.
+ (estream_INIT): Call.
+
+2014-08-12 Joe Hansen <joedalton2@yahoo.dk>
+
+ Update Danish translation.
+ + commit 1be556e5bb1fb7262a1b5630ac939cfcaadc7100
+ * po/da.po: Update.
+
+2014-08-10 Werner Koch <wk@gnupg.org>
+
+ tests: Fix compiler warning.
+ + commit ab5eff46116a9a246ffb2c083bec637d0321d0cb
+ * tests/t-lock.c: Include header vor getpid.
+ (revision_thread): Init "i" to avoid compiler warning.
+
+2014-08-06 NIIBE Yutaka <gniibe@fsij.org>
+
+ Update ja.po.
+ + commit 7b7e08e6f3561724006b63679c2500a62fc73837
+
+
+2014-08-05 Werner Koch <wk@gnupg.org>
+
+ Use 16 byte alignment for hppa-unknown-linux-gnu.
+ + commit 3325403c0dd2949bf52efa1b9a5b5cf3191110f9
+ * configure.ac (HAVE_GCC_ATTRIBUTE_ALIGNED): New.
+ * src/gen-posix-lock-obj.c (USE_16BYTE_ALIGNMENT): Set for HPPA-Linux.
+ (main): Enforce alignment if needed.
+ * src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h: Use 16 byte
+ alignment.
+
+2014-07-27 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Add new lock-obj-pub.*.h from debian buildds.
+ + commit 8338a4ba93367974758dc5e195f67e9d171d4086
+ * src/syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h: New.
+ * src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabihf.h: New.
+ * src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.i486-pc-gnu.h: New.
+ * src/syscfg/lock-obj-pub.i486-pc-kfreebsd-gnu.h: New.
+ * src/syscfg/lock-obj-pub.i486-pc-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.mips-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h: New.
+ * src/syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h: New.
+ * src/syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h: New.
+ * src/Makefile.am (lock_obj_pub): Add new files.
+
+2014-06-30 Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+ Improve logging in a test module.
+ + commit c7c41582574304974feac8bbd89b1460fbf6c92c
+ * tests/t-version.c (main): Print program name.
+
+2014-06-25 Werner Koch <wk@gnupg.org>
+
+ Add missing prototype for build tool.
+ + commit 51f9a8180ecbc24ed092bef5f2aa920a76769dcb
+ * src/gen-posix-lock-obj.c: Include string.h.
+
+2014-06-10 Werner Koch <wk@gnupg.org>
+
+ New error code GPG_ERR_KEY_DISABLED.
+ + commit 3fada688c0df6e3140e4fcaf59b9bcfcc7a70bf4
+
+
2014-04-15 Werner Koch <wk@gnupg.org>
Release 1.13.
+ + commit 1900266b743cabdb39a0d6f8dd00d187a2ad2c97
* configure.ac: Set LT version to C11/A11/R0.
Update pl.po.
+ + commit db6e26cad81957729adc9549e4c6afe28bc55d76
+
Add code GPG_ERR_KEY_ON_CARD.
+ + commit d4b83dbad235973e521eb12b680ee43cfb5cbc9a
+
2014-01-29 Werner Koch <wk@gnupg.org>
Fix a syscfg/ file name.
+ + commit bb5318aa5536fa48ec240c2ff48b9e2e1d9916ef
* src/syscfg/lock-obj.arm-unknown-linux-androideabi.h: Rename to ...
* src/syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h: this.
* src/Makefile.am (lock_obj_pub): Fix file name.
@@ -17,11 +1336,13 @@
2014-01-28 Werner Koch <wk@gnupg.org>
Fix the name of the file in the comment of the output.
+ + commit 6245bf65fc2554c7c103324d451036de08869458
* src/gen-posix-lock-obj.c (main): Chnage comment in created file.
2014-01-25 Werner Koch <wk@gnupg.org>
Add lock info for arm-unknown-linux-androideabi.
+ + commit e1aa030d7655743f0c3cdd5f7b26ae1b4665fbc6
* src/syscfg/lock-obj.arm-unknown-linux-androideabi.h: New. Provided
by Hans-Christoph Steiner.
* src/Makefile.am (lock_obj_pub): Add file.
@@ -29,13 +1350,16 @@
2014-01-24 Werner Koch <wk@gnupg.org>
tests: Call srand for each thread under Windows.
+ + commit 8e352780fd0e2fbc8f4c4971aae188d62df24d0a
* tests/t-lock.c (accountant_thread) [W32]: Call srand.
Do not use the threadlib macros for Windows.
+ + commit 2e4c5963119dc02cac7b8f0dfb46572c43d1ebe7
* configure.ac: Move platform detection before gl_THREADLIB_EARLY. Do
not use gl_THREADLIB for Windows.
Make multi-threading flags available via gpg-error-config.
+ + commit f209d163a8167caa6910cd367aba923f703ac69e
* m4/threadlib.m4: Set THREADLIB_CPPFLAGS.
* src/gpg-error-config.in: Add option --mt.
* configure.ac: Add support for the --mt option.
@@ -43,18 +1367,21 @@
GPG_ERROR_MT_LIBS.
Allow using gpgrt_lock_init on an unitialized variable.
+ + commit 4e8a88e7632b1f1d2b31ae738a159802549882c3
* src/posix-lock.c (gpgrt_lock_init): Detect unitialized lock var.
* src/w32-lock.c (gpgrt_lock_init): Ditto.
2014-01-17 Werner Koch <wk@gnupg.org>
Move version number first in the Posix lock-obj.
+ + commit e07538c0ed3c5cb3d870a490a4c12bef4375278a
* src/posix-lock-obj.h (_gpgrt_lock_t): Swap VERS and MTX and put MTX
into a union.
* src/posix-lock.c (gpgrt_lock_lock): Adjust for this change.
* src/gen-posix-lock-obj.c (main): Change output accordingly.
Extend the platform dependent build rules.
+ + commit d83b12213231443b93de39863b916ada6232035a
* src/mkheader.c (mk_include_name): New.
(include_file): Implement '&' substitution.
(try_include_file): New.
@@ -74,9 +1401,11 @@
2014-01-16 Werner Koch <wk@gnupg.org>
Fix linking for last change on non-ELF platforms.
+ + commit 4f9b13e99bdfed886dadfd1b70a69af3747ebc98
* src/Makefile.am (libgpg_error_la_LIBADD): Add LIBTHREAD.
Add gpgrt_lock_ functions.
+ + commit ff937c39febe63d52c55590d8e3bd3a460f26651
* src/gpg-error.h.in (GPGRT_LOCK_DEFINE): New.
(gpgrt_lock_init): New.
(gpgrt_lock_lock): New.
@@ -108,6 +1437,7 @@
2014-01-14 Werner Koch <wk@gnupg.org>
Improve maintainability by rewriting the mkheader helper.
+ + commit 78a06348fb07f2dce861615cc6d19964818f7334
* src/mkheader.c: New. Based on the mkheader from Libassuan.
* src/mkheader.awk: Remove.
* src/errnos.in: Add trailing linefeed.
@@ -124,13 +1454,17 @@
2014-01-10 Werner Koch <wk@gnupg.org>
po: Update de.po.
+ + commit c1871fddf85cdddc33c1b35d5f1c8bae76388ee5
+
Use the generic autogen.sh script.
+ + commit e3ff40a78e9e95e1296b66f9c0d3df905c8af0d3
* Makefile.am (EXTRA_DIST): Add autogen.rc remove config.rpath.
* autogen.rc: New.
* autogen.sh: Update from current GnuPG.
Move helper scripts to build-aux.
+ + commit 69c15393d1dac28e08c3b84b1aea286f12327847
* compile, config.guess, config.rpath, config.sub
* depcomp, install-sh, ltmain.sh, missing: Move to build-aux/.
* configure.ac (AC_CONFIG_AUX_DIR): New.
@@ -138,45 +1472,58 @@
2013-12-09 Werner Koch <wk@gnupg.org>
Add build support for ppc64le.
+ + commit 0b192cff772bd416dc85b8140b9eb0d52e4175dd
* config.guess, config.sub: Update to latest version (2013-11-29).
* m4/libtool.m4: Add patches for ppc64le.
2013-12-09 David 'Digit' Turner <digit@google.com>
Update libtool to support Android.
+ + commit bf0d67dbfa4161e529781d6dfbfcce7126c3bf22
* m4/libtool.m4: Add "linux*android*" case. Taken from the libtool
repository.
2013-11-17 Werner Koch <wk@gnupg.org>
Add GPG_ERR_MAC_ALGO.
+ + commit b70a430d020e8541f66cca38c00355bab7bb1017
+
2013-07-15 Werner Koch <wk@gnupg.org>
w32: Fix corrupted string output.
+ + commit 52e1f2e131b422fdb66abeaf4a8f084689b39bf7
* src/w32-gettext.c (get_string): Pass the nul of the utf-8 string to
the conversion function but keep TRANSLEN without the nul.
2013-06-24 Werner Koch <wk@gnupg.org>
Release 1.12.
+ + commit 12243cebd558dcadf8e85eea39b6db5f0b314667
* configure.ac: Set LT version to C10/A10/R0.
Update German translation.
+ + commit f85ef07dca7c931d63b202d94bfaccba0a30f7f6
+
2013-06-17 Werner Koch <wk@gnupg.org>
Add hack to have different names for 64 bit Windows DLLs.
+ + commit ca46b9a7bccb2eab085fc45722ffca1210f48223
* ltmain.sh: Prefix the SO number for W64 with a "6".
Support building for w64.
+ + commit 1ca9b0dec0bfee560ce43d9dac6a26557ebe67a1
+
2013-05-23 Werner Koch <wk@gnupg.org>
w32: Fix installing of .def file.
+ + commit db438148df9623528aa7305b6d56edd23db8cbbe
* src/Makefile.am (install-def-file): Create libdir first.
Fix libtool 2.4.2 to correctly detect .def files.
+ + commit dd05f3790e536dec6ed56087780a1065ca66371e
* ltmain.sh (sed_uncomment_deffile): New.
(orig_export_symbols): Uncomment def file before testing for EXPORTS.
* m4/libtool.m4: Do the same for the generated code.
@@ -184,6 +1531,7 @@
2013-04-11 Werner Koch <wk@gnupg.org>
Add GPG_ERR_*CRYPT_CTX* and GPG_ERR_BROKEN_*KEY.
+ + commit d2e6d96dfd2acc855b244a972269adfcf477cd10
* src/err-codes.h.in (GPG_ERR_NO_CRYPT_CTX): New.
(GPG_ERR_WRONG_CRYPT_CTX, GPG_ERR_BAD_CRYPT_CTX): New.
(GPG_ERR_CRYPT_CTX_CONFLICT): New.
@@ -192,6 +1540,7 @@
2013-02-25 Werner Koch <wk@gnupg.org>
Release 1.11.
+ + commit 3367ff0aa51b6685e37b749b3179643b82d23064
* configure.ac: Set LT version to C9/A9/R0.
* Makefile.am (GITLOG_TO_CHANGELOG): New.
@@ -199,20 +1548,24 @@
* build-aux/gitlog-to-changelog: Remove.
Update helper scripts.
+ + commit b0ce47b730452bb28d5f46db3857c9efa5f9f51e
* compile, config.guess, config.rpath, config.sub, depcomp,
* install-sh, mkinstalldirs: Update to current versions from gnulib.
2013-02-23 Werner Koch <wk@gnupg.org>
Add translation to Ukrainian.
+ + commit 47ff6a21c6d84acebef3ff20d982a6c255a6d282
* po/uk.po: New.
* po/LINGUAS: Add uk.po
Add translation to Esperanto.
+ + commit 95c63baa0516592ec1a1c045565d6f992cc807eb
* po/eo.po: New.
* po/LINGUAS: Add eo.po.
Add version macros and check function.
+ + commit e6943de88627c6662fba3fe905c8761dbf0ccfa1
* configure.ac (VERSION_NUMBER): New ac_subst.
(BUILD_FILEVERSION): Build on all platforms
(BUILD_TIMESTAMP): Try to use an ISO string.
@@ -230,84 +1583,105 @@
2013-02-22 Werner Koch <wk@gnupg.org>
Fix the alias mechanism for --with-libgpg-error-prefix.
+ + commit 056cc2d0dfef023fda47ce377d3ee544612526a3
* src/gpg-error.m4: Do not use the no-action branch in AC_ARG_WITH.
2012-11-16 Werner Koch <wk@gnupg.org>
Switch to the new automagic beta numbering scheme.
+ + commit 3977201d2a82fcbe0341660e07a3b0d5c790f927
* configure.ac: Change to a git only revision id setup.
(BUILD_FILEVERSION): Use revision id for this.
* src/versioninfo.rc.in (FileVersion): Use LT version.
Update to libtool 2.4.2.
+ + commit 6971fe55fb76f3c93058ebdef37dc179dff5d651
+
Add new source id for Libassuan.
+ + commit d447a2150c235878e2c80afcc99e207755cfd2f9
* src/err-sources.h.in (GPG_ERR_SOURCE_ASSUAN): New.
Improve parsing of the GIT revision number.
+ + commit b2e4d03c88823151aa30f8a878ad1a30618d1340
* configure.ac (git_revision): Use git rev-parse.
Fix non-portable use of chmod in autogen.sh.
+ + commit 17c8c16ee2dcb33abb7fdf50c40015f1b9d13689
* autogen.sh: Remove option -c from chmod.
2012-08-09 Werner Koch <wk@gnupg.org>
Update Italian translation.
+ + commit 3034b80debc15e6372fbc36a1814b2d273d9e4a7
+
2012-08-09 Jordy Provost <jordy.provost@free.fr>
Typo fix.
+ + commit 9216a742c75432fb2ea0ee1e1818459014e051c5
* src/err-codes.h.in: Unify uppercase.
2012-08-09 Freek de Kruijf <f.de.kruijf@gmail.com>
Update Dutch translation.
+ + commit 10373c0d9f4a557ee9af5f1569749b9697a7ae33
* po/nl.po: Update.
2012-08-09 Petr Pisar <petr.pisar@atlas.cz>
Update Czech translation.
+ + commit f95162ecc92f338bf244ffdb402ade617d207d7a
* po/cs.po: Update.
2012-08-09 Joe Hansen <joedalton2@yahoo.dk>
Add Danish translation.
+ + commit 7adbeeb806d7cd373a159b0acfc9b733a3295356
* po/da.po: New.
* po/LINGUAS: Add da.po.
2012-08-09 David Prévot <taffit@debian.org>
Update French translation.
+ + commit 42471f9cbd59d427c9e1a8bf0267835f1395c6b4
* po/fr.po: Update, proofread by Jordy Provost
Keep previous msgids of translated messages.
+ + commit f7db2dceb8d1da2606d039c04bc84f331f9cfe89
* po/Makefile.in.in: Add --previous option to msgmerge.
2012-08-07 Werner Koch <wk@gnupg.org>
Add Japanese translation.
+ + commit 4fef48a0868ca1379d016f41c9d810857c00655f
* po/ja.po: New.
* po/LINGUAS: Add ja.po.
Update German translation.
+ + commit 2ed3e70f0aeec41ece79d96a8ea6d114addf954d
* po/de.po: Update.
2012-06-20 Rafaël Carré <funman@videolan.org>
Use CPPFLAGS when generating mkerrcodes.h.
+ + commit c35dbfdaa2e30e08185e4a468278a29e2c48b500
* src/Makefile.am (mkerrcodes.h): Use CPPFLAGS.
2011-12-01 Werner Koch <wk@gnupg.org>
Remove non-source file from the repo.
+ + commit a7eb1bec2b76318bd17d4413d7f44197a241e3bc
* po/remove-potcdate.sed: Remove.
Fix for newer autoconf version.
+ + commit 5a0d2a5abc0a707c20449b6afd37daa9fd373a18
* Makefile.am (EXTRA_DIST): Fix filename.
* configure.ac (my_full_version): New.
(AC_INIT): Use new macro. Change bug address to the bug tracker URL.
Generate the ChangeLog from commit logs.
+ + commit 9d75d671d66386ad862db0466c4dd67a246dfe72
* build-aux/gitlog-to-changelog: New script. Taken from gnulib.
* build-aux/git-log-fix: New file.
* build-aux/git-log-footer: New file.
diff --git a/Makefile.am b/Makefile.am
index 9cab484..f5d0b81 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -14,16 +14,16 @@
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = dist-bzip2
+DISTCHECK_CONFIGURE_FLAGS = --enable-doc
# (A suitable gitlog-to-changelog script can be found in GnuPG master.)
GITLOG_TO_CHANGELOG=gitlog-to-changelog
EXTRA_DIST = autogen.sh autogen.rc libgpg-error.spec.in \
- COPYING COPYING.LIB potomo doc/HACKING ChangeLog-2011 \
+ VERSION COPYING COPYING.LIB potomo doc/HACKING ChangeLog-2011 \
po/ChangeLog-2011 m4/ChangeLog-2011 contrib/ChangeLog-2011 \
build-aux/git-log-footer build-aux/git-log-fix
@@ -33,13 +33,38 @@ else
lang_subdirs =
endif
-SUBDIRS = m4 src tests po $(lang_subdirs)
+if BUILD_DOC
+doc = doc
+else
+doc =
+endif
+
+if BUILD_TESTS
+tests = tests
+else
+tests =
+endif
+
+SUBDIRS = m4 src $(doc) $(tests) po $(lang_subdirs)
dist-hook: gen-ChangeLog
sed -e 's/@pkg_version@/$(VERSION)/g' \
$(top_srcdir)/libgpg-error.spec.in > $(distdir)/libgpg-error.spec
- @set -e; echo "$(VERSION)" > $(distdir)/VERSION
+
+distcheck-hook:
+ set -e; ( \
+ pref="#+macro: $$(echo $(PACKAGE_NAME)|tr '-' '_')_" ;\
+ reldate="$$(date -u +%Y-%m-%d)" ;\
+ echo "$${pref}ver $(PACKAGE_VERSION)" ;\
+ echo "$${pref}date $${reldate}" ;\
+ list='$(DIST_ARCHIVES)'; for i in $$list; do \
+ case "$$i" in *.tar.bz2) \
+ echo "$${pref}size $$(wc -c <$$i|awk '{print int($$1/1024)}')k" ;\
+ echo "$${pref}sha1 $$(sha1sum <$$i|cut -d' ' -f1)" ;\
+ echo "$${pref}sha2 $$(sha256sum <$$i|cut -d' ' -f1)" ;;\
+ esac;\
+ done ) | tee $(distdir).swdb
gen_start_date = 2011-12-01T00:00:00
diff --git a/Makefile.in b/Makefile.in
index 22a8860..4dc69cb 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -31,25 +30,53 @@
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
esac; \
- test $$am__dry = yes; \
- }
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -69,23 +96,32 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/config.h.in \
- $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING COPYING.LIB \
- ChangeLog INSTALL NEWS THANKS build-aux/compile \
- build-aux/config.guess build-aux/config.rpath \
- build-aux/config.sub build-aux/depcomp build-aux/install-sh \
- build-aux/ltmain.sh build-aux/missing mkinstalldirs
+DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
+ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/configure $(am__configure_deps) \
+ $(srcdir)/config.h.in ABOUT-NLS COPYING COPYING.LIB THANKS \
+ build-aux/compile build-aux/config.guess \
+ build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
+ build-aux/install-sh build-aux/mdate-sh build-aux/missing \
+ mkinstalldirs build-aux/texinfo.tex build-aux/ltmain.sh \
+ $(top_srcdir)/build-aux/compile \
+ $(top_srcdir)/build-aux/config.guess \
+ $(top_srcdir)/build-aux/config.rpath \
+ $(top_srcdir)/build-aux/config.sub \
+ $(top_srcdir)/build-aux/install-sh \
+ $(top_srcdir)/build-aux/ltmain.sh \
+ $(top_srcdir)/build-aux/missing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
@@ -94,21 +130,28 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
+am__v_at_1 =
SOURCES =
DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -116,12 +159,34 @@ am__can_run_installinfo = \
esac
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
- distdir dist dist-all distcheck
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+ $(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
-DIST_SUBDIRS = m4 src tests po lang
+CSCOPE = cscope
+DIST_SUBDIRS = m4 src doc tests po lang
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
@@ -131,6 +196,7 @@ am__remove_distdir = \
&& rm -rf "$(distdir)" \
|| { sleep 5 && rm -rf "$(distdir)"; }; \
else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
am__relativize = \
dir0=`pwd`; \
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
@@ -158,6 +224,7 @@ am__relativize = \
reldir="$$dir2"
DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
GZIP_ENV = --best
+DIST_TARGETS = dist-bzip2 dist-gzip
distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@@ -174,6 +241,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -221,6 +289,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -315,18 +384,22 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = dist-bzip2
+DISTCHECK_CONFIGURE_FLAGS = --enable-doc
# (A suitable gitlog-to-changelog script can be found in GnuPG master.)
GITLOG_TO_CHANGELOG = gitlog-to-changelog
EXTRA_DIST = autogen.sh autogen.rc libgpg-error.spec.in \
- COPYING COPYING.LIB potomo doc/HACKING ChangeLog-2011 \
+ VERSION COPYING COPYING.LIB potomo doc/HACKING ChangeLog-2011 \
po/ChangeLog-2011 m4/ChangeLog-2011 contrib/ChangeLog-2011 \
build-aux/git-log-footer build-aux/git-log-fix
@LANGUAGES_SOME_FALSE@lang_subdirs =
@LANGUAGES_SOME_TRUE@lang_subdirs = lang
-SUBDIRS = m4 src tests po $(lang_subdirs)
+@BUILD_DOC_FALSE@doc =
+@BUILD_DOC_TRUE@doc = doc
+@BUILD_TESTS_FALSE@tests =
+@BUILD_TESTS_TRUE@tests = tests
+SUBDIRS = m4 src $(doc) $(tests) po $(lang_subdirs)
gen_start_date = 2011-12-01T00:00:00
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
@@ -368,8 +441,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
config.h: stamp-h1
- @if test ! -f $@; then rm -f stamp-h1; else :; fi
- @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
@@ -392,22 +465,25 @@ distclean-libtool:
-rm -f libtool config.lt
# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
@@ -422,57 +498,12 @@ $(RECURSIVE_TARGETS):
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
@@ -488,12 +519,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -505,15 +531,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -522,9 +544,31 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
distdir: $(DISTFILES)
$(am__remove_distdir)
@@ -595,40 +639,41 @@ distdir: $(DISTFILES)
|| chmod -R a+r "$(distdir)"
dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-lzip: distdir
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
- $(am__remove_distdir)
-
-dist-lzma: distdir
- tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-xz: distdir
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-tarZ: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-shar: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
-dist dist-all: distdir
- tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
- $(am__remove_distdir)
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
@@ -639,8 +684,6 @@ distcheck: dist
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
- *.tar.lzma*) \
- lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.lz*) \
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
*.tar.xz*) \
@@ -652,18 +695,20 @@ distcheck: dist
*.zip*) \
unzip $(distdir).zip ;;\
esac
- chmod -R a-w $(distdir); chmod u+w $(distdir)
- mkdir $(distdir)/_build
- mkdir $(distdir)/_inst
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_inst
chmod a-w $(distdir)
test -d $(distdir)/_build || exit 0; \
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && $(MAKE) $(AM_MAKEFLAGS) distcheck-hook \
&& am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \
- && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ && ../configure \
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=.. --prefix="$$dc_install_base" \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
@@ -686,7 +731,7 @@ distcheck: dist
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
&& cd "$$am__cwd" \
|| exit 1
- $(am__remove_distdir)
+ $(am__post_remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
@@ -823,32 +868,44 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
- ctags-recursive install-am install-data-am install-strip \
- tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am am--refresh check check-am clean clean-generic \
- clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
- dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \
- dist-xz dist-zip distcheck distclean distclean-generic \
- distclean-hdr distclean-libtool distclean-tags distcleancheck \
- distdir distuninstallcheck dvi dvi-am html html-am info \
- info-am install install-am install-data install-data-am \
- install-data-hook install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
+.MAKE: $(am__recursive_targets) all install-am install-data-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am clean clean-cscope clean-generic \
+ clean-libtool cscope cscopelist-am ctags ctags-am dist \
+ dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+ dist-tarZ dist-xz dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-data-hook install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
dist-hook: gen-ChangeLog
sed -e 's/@pkg_version@/$(VERSION)/g' \
$(top_srcdir)/libgpg-error.spec.in > $(distdir)/libgpg-error.spec
- @set -e; echo "$(VERSION)" > $(distdir)/VERSION
+
+distcheck-hook:
+ set -e; ( \
+ pref="#+macro: $$(echo $(PACKAGE_NAME)|tr '-' '_')_" ;\
+ reldate="$$(date -u +%Y-%m-%d)" ;\
+ echo "$${pref}ver $(PACKAGE_VERSION)" ;\
+ echo "$${pref}date $${reldate}" ;\
+ list='$(DIST_ARCHIVES)'; for i in $$list; do \
+ case "$$i" in *.tar.bz2) \
+ echo "$${pref}size $$(wc -c <$$i|awk '{print int($$1/1024)}')k" ;\
+ echo "$${pref}sha1 $$(sha1sum <$$i|cut -d' ' -f1)" ;\
+ echo "$${pref}sha2 $$(sha256sum <$$i|cut -d' ' -f1)" ;;\
+ esac;\
+ done ) | tee $(distdir).swdb
.PHONY: gen-ChangeLog
gen-ChangeLog:
set -e; \
diff --git a/NEWS b/NEWS
index c2d36bc..89920ca 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,377 @@
-Noteworthy changes in version 1.13 (2014-04-15)
+Noteworthy changes in version 1.27 (2017-02-28) [C22/A22/R0]
+-----------------------------------------------
+
+ * Added a Base64 decoder.
+
+ * Added support for the sh3 architecture.
+
+ * Added header gpgrt.h as an alias for gpg-error.h.
+
+ * Fixed macro GPGRT_GCC_VERSION.
+
+ * Fixed a race in non-blocking I/O on Windows.
+
+ * Interface changes relative to the 1.26 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ gpgrt_b64state_t NEW type.
+ gpgrt_b64dec_start NEW.
+ gpgrt_b64dec_proc NEW.
+ gpgrt_b64dec_finish NEW.
+ GPG_ERR_WRONG_NAME NEW.
+ gpgrt.h NEW header.
+
+
+Noteworthy changes in version 1.26 (2016-12-21) [C21/A21/R0]
+-----------------------------------------------
+
+ * New option --desc for gpg-error.
+
+ * Interface changes relative to the 1.25 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_UNKNOWN_FLAG NEW.
+ GPG_ERR_INV_ORDER NEW.
+ GPG_ERR_ALREADY_FETCHED NEW.
+ GPG_ERR_TRY_LATER NEW.
+ GPG_ERR_SYSTEM_BUG NEW.
+ GPG_ERR_DNS_UNKNOWN NEW.
+ GPG_ERR_DNS_SECTION NEW.
+ GPG_ERR_DNS_ADDRESS NEW.
+ GPG_ERR_DNS_NO_QUERY NEW.
+ GPG_ERR_DNS_NO_ANSWER NEW.
+ GPG_ERR_DNS_CLOSED NEW.
+ GPG_ERR_DNS_VERIFY NEW.
+ GPG_ERR_DNS_TIMEOUT NEW.
+
+
+Noteworthy changes in version 1.25 (2016-11-14) [C20/A20/R0]
+-----------------------------------------------
+
+ * New interface gpgrt_get_syscall_clamp to allow libaries to make use
+ of Libgpg-error's system call wrapper functions.
+
+ * gpgrt_poll does now work under Windows.
+
+ * Fixed bug in the locking code when used with the nPth threading
+ library.
+
+ * Added support for {i686,x86_64}-apple-darwin.
+
+ * Added new error codes.
+
+ * Interface changes relative to the 1.23 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ gpgrt_get_syscall_clamp NEW.
+ GPG_ERR_ENGINE_TOO_OLD NEW.
+ GPG_ERR_WINDOW_TOO_SMALL NEW.
+ GPG_ERR_WINDOW_TOO_LARGE NEW.
+ GPG_ERR_MISSING_ENVVAR NEW.
+ GPG_ERR_USER_ID_EXISTS NEW.
+ GPG_ERR_NAME_EXISTS NEW.
+ GPG_ERR_DUP_NAME NEW.
+ GPG_ERR_TOO_OLD NEW.
+ GPG_ERR_TOO_YOUNG NEW.
+
+
+Noteworthy changes in version 1.24 (2016-07-14) [C19/A19/R1]
+-----------------------------------------------
+
+ * Fixes a bug in es_fclose_snatch when used used after es_fseek.
+
+ * Fixes building without thread support.
+
+ * New configure option --disable-tests.
+
+
+Noteworthy changes in version 1.23 (2016-06-15) [C19/A19/R0]
+-----------------------------------------------
+
+ * Fixes an assertion failure due to es_flush on read/write streams.
+
+ * Fixes a bug with a too short memory limit is es_fopenmen.
+
+ * Cross-build support for powerpc-unknown-linux-gnuspe and
+ tilegx-unknown-linux-gnu architectures.
+
+ * Interface changes relative to the 1.22 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_SUBKEYS_EXP_OR_REV NEW.
+
+
+Noteworthy changes in version 1.22 (2016-04-25) [C18/A18/R0]
+-----------------------------------------------
+
+ * New functions and macros to to provide iconv(3) on Windows.
+
+ * Support for LeakSanitizer with the gpgrt_annotate_leaked_object
+ inline function.
+
+ * Interface changes relative to the 1.21 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_DB_CORRUPTED NEW.
+ gpgrt_annotate_leaked_object NEW inline func.
+ GPGRT_ENABLE_W32_ICONV_MACROS NEW.
+ gpgrt_w32_iconv_open NEW.
+ gpgrt_w32_iconv_close NEW.
+ gpgrt_w32_iconv NEW.
+
+
+Noteworthy changes in version 1.21 (2015-12-12) [C17/A17/R0]
+-----------------------------------------------
+
+ * New functions gpgrt_poll and gpgrt_set_nonblock. For now only
+ pipes and sockets on Unix are supported.
+
+ * Fixes gettext output encoding problems on Windows.
+
+ * Interface changes relative to the 1.20 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ gpgrt_set_nonblock NEW.
+ gpgrt_get_nonblock NEW.
+ gpgrt_poll NEW.
+ gpgrt_poll_t NEW type.
+ es_poll_t NEW type.
+ es_set_nonblock NEW macro.
+ es_get_nonblock NEW macro.
+ es_poll NEW macro.
+ GPG_ERR_TRUE NEW.
+ GPG_ERR_FALSE NEW.
+ GPG_ERR_NO_NAME NEW.
+ GPG_ERR_NO_KEY NEW.
+ GPG_ERR_SERVER_FAILED NEW.
+
+
+Noteworthy changes in version 1.20 (2015-08-26) [C16/A16/R0]
+-----------------------------------------------
+
+ * New macros for GCC attributes.
+
+ * Make es_set_binary actually work for Windows.
+
+ * Allow building without thread support.
+
+ * Build without a build timestamp by default.
+
+ * Interface changes relative to the 1.19 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPGRT_VERSION NEW macro.
+ GPGRT_VERSION_NUMBER NEW macro.
+ GPGRT_INLINE NEW macro.
+ GPGRT_GCC_VERSION NEW macro.
+ GPGRT_ATTR_NORETURN NEW macro.
+ GPGRT_ATTR_PRINTF NEW macro.
+ GPGRT_ATTR_NR_PRINTF NEW macro.
+ GPGRT_ATTR_FORMAT_ARG NEW macro.
+ GPGRT_ATTR_SENTINEL NEW macro.
+ GPGRT_ATTR_USED NEW macro.
+ GPGRT_ATTR_UNUSED NEW macro.
+ GPGRT_ATTR_DEPRECATED NEW macro.
+ GPGRT_ATTR_PURE NEW macro.
+ GPGRT_ATTR_MALLOC NEW macro.
+ GPGRT_HAVE_MACRO_FUNCTION NEW macro.
+ GPGRT_HAVE_PRAGMA_GCC_PUSH NEW macro.
+
+
+Noteworthy changes in version 1.19 (2015-04-10) [C15/A15/R0]
+-----------------------------------------------
+
+ * New set of error codes for use with LDAP.
+
+ * New options --help and --defines for gpg-error.
+
+ * Allow building with gcc 5.
+
+ * Interface changes relative to the 1.18 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_LDAP_* NEW.
+
+
+Noteworthy changes in version 1.18 (2015-01-26) [C14/A14/R0]
+-----------------------------------------------
+
+ * New translations for Hungarian, Portuguese, Russian, and
+ traditional Chinese. Updated other translations.
+
+ * New error codes.
+
+ * Interface changes relative to the 1.17 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_FORBIDDEN NEW.
+ GPG_ERR_OBJ_TERM_STATE NEW.
+ GPG_ERR_REQUEST_TOO_SHORT NEW.
+ GPG_ERR_REQUEST_TOO_LONG NEW.
+ GPG_ERR_LEGACY_KEY NEW.
+
+
+Noteworthy changes in version 1.17 (2014-10-15) [C13/A13/R0]
+-----------------------------------------------
+
+ * New error codes for TLS protocol libraries.
+
+ * New configure option --enable-build-timestamp.
+
+ * New man page for gpg-error-config.
+
+ * Interface changes relative to the 1.16 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_SOURCE_TLS NEW.
+ GPG_ERR_NO_CERT_CHAIN NEW.
+ GPG_ERR_CERT_TOO_LARGE NEW.
+ GPG_ERR_INV_RECORD NEW.
+ GPG_ERR_BAD_MAC NEW.
+ GPG_ERR_UNEXPECTED_MSG NEW.
+ GPG_ERR_COMPR_FAILED NEW.
+ GPG_ERR_WOULD_WRAP NEW.
+ GPG_ERR_FATAL_ALERT NEW.
+ GPG_ERR_NO_CIPHER NEW.
+ GPG_ERR_MISSING_CLIENT_CERT NEW.
+ GPG_ERR_CLOSE_NOTIFY NEW.
+ GPG_ERR_TICKET_EXPIRED NEW.
+ GPG_ERR_BAD_TICKET NEW.
+ GPG_ERR_UNKNOWN_IDENTITY NEW.
+ GPG_ERR_BAD_HS_CERT NEW.
+ GPG_ERR_BAD_HS_CERT_REQ NEW.
+ GPG_ERR_BAD_HS_CERT_VER NEW.
+ GPG_ERR_BAD_HS_CHANGE_CIPHER NEW.
+ GPG_ERR_BAD_HS_CLIENT_HELLO NEW.
+ GPG_ERR_BAD_HS_SERVER_HELLO NEW.
+ GPG_ERR_BAD_HS_SERVER_HELLO_DONE NEW.
+ GPG_ERR_BAD_HS_FINISHED NEW.
+ GPG_ERR_BAD_HS_SERVER_KEX NEW.
+ GPG_ERR_BAD_HS_CLIENT_KEX NEW.
+ GPG_ERR_BOGUS_STRING NEW.
+ gpgrt_pending NEW.
+ gpgrt_pending_unlocked NEW.
+
+
+Noteworthy changes in version 1.16 (2014-09-18) [C12/A12/R2]
+-----------------------------------------------
+
+ * Support building for iOS.
+
+ * Fixed a prototype mismatch.
+
+ * Fix es_fclose for streams opened with "samethread".
+
+
+Noteworthy changes in version 1.15 (2014-09-11) [C12/A12/R1]
+-----------------------------------------------
+
+ * This releases fixes problems with the use of off_t and ssize_t by
+ the estream functions introduced with 1.14. Although this is
+ technically an ABI break on some platforms, we take this as a
+ simple bug fix for 1.14. The new functions are very unlikely in
+ use by any code and thus no breakage should happen. The 1.14
+ tarball will be removed from the archive.
+
+ * Add type gpgrt_off_t which is guaranteed to be 64 bit.
+
+ * Add type gpgrt_ssize_t to make use on Windows easier. On Unix
+ platforms this is an alias for ssize_t.
+
+
+Noteworthy changes in version 1.14 (2014-09-08) [C12/A12/R0]
+-----------------------------------------------
+
+ * Added gpgrt_lock_trylock.
+
+ * Added the estream library under the name gpgrt and a set of macros
+ to use them with their "es_" names.
+
+ * Interface changes relative to the 1.13 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GPG_ERR_KEY_DISABLED NEW.
+ gpgrt_init NEW macro.
+ gpgrt_check_version NEW.
+ gpgrt_lock_trylock NEW.
+ gpgrt_set_syscall_clamp NEW.
+ gpgrt_set_alloc_func NEW.
+ gpgrt_stream_t NEW.
+ gpgrt_cookie_io_functions_t NEW.
+ gpgrt_syshd_t NEW.
+ GPGRT_SYSHD_NONE NEW.
+ GPGRT_SYSHD_FD NEW.
+ GPGRT_SYSHD_SOCK NEW.
+ GPGRT_SYSHD_RVID NEW.
+ GPGRT_SYSHD_HANDLE NEW.
+ gpgrt_stdin NEW macro.
+ gpgrt_stdout NEW macro.
+ gpgrt_stderr NEW macro.
+ gpgrt_fopen NEW.
+ gpgrt_mopen NEW.
+ gpgrt_fopenmem NEW.
+ gpgrt_fopenmem_init NEW.
+ gpgrt_fdopen NEW.
+ gpgrt_fdopen_nc NEW.
+ gpgrt_sysopen NEW.
+ gpgrt_sysopen_nc NEW.
+ gpgrt_fpopen NEW.
+ gpgrt_fpopen_nc NEW.
+ gpgrt_freopen NEW.
+ gpgrt_fopencookie NEW.
+ gpgrt_fclose NEW.
+ gpgrt_fclose_snatch NEW.
+ gpgrt_onclose NEW.
+ gpgrt_fileno NEW.
+ gpgrt_fileno_unlocked NEW.
+ gpgrt_syshd NEW.
+ gpgrt_syshd_unlocked NEW.
+ gpgrt_flockfile NEW.
+ gpgrt_ftrylockfile NEW.
+ gpgrt_funlockfile NEW.
+ gpgrt_feof NEW.
+ gpgrt_feof_unlocked NEW.
+ gpgrt_ferror NEW.
+ gpgrt_ferror_unlocked NEW.
+ gpgrt_clearerr NEW.
+ gpgrt_clearerr_unlocked NEW.
+ gpgrt_fflush NEW.
+ gpgrt_fseek NEW.
+ gpgrt_fseeko NEW.
+ gpgrt_ftell NEW.
+ gpgrt_ftello NEW.
+ gpgrt_rewind NEW.
+ gpgrt_getc NEW macro.
+ gpgrt_getc_unlocked NEW macro.
+ gpgrt_fgetc NEW.
+ gpgrt_fputc NEW.
+ gpgrt_ungetc NEW.
+ gpgrt_read NEW.
+ gpgrt_write NEW.
+ gpgrt_write_sanitized NEW.
+ gpgrt_write_hexstring NEW.
+ gpgrt_fread NEW.
+ gpgrt_fwrite NEW.
+ gpgrt_fgets NEW.
+ gpgrt_putc NEW macro.
+ gpgrt_putc_unlocked NEW macro.
+ gpgrt_fputs NEW.
+ gpgrt_fputs_unlocked NEW.
+ gpgrt_getline NEW.
+ gpgrt_read_line NEW.
+ gpgrt_free NEW.
+ gpgrt_fprintf NEW.
+ gpgrt_fprintf_unlocked NEW.
+ gpgrt_printf NEW.
+ gpgrt_printf_unlocked NEW.
+ gpgrt_vfprintf NEW.
+ gpgrt_vfprintf_unlocked NEW.
+ gpgrt_setvbuf NEW.
+ gpgrt_setbuf NEW.
+ gpgrt_set_binary NEW.
+ gpgrt_tmpfile NEW.
+ gpgrt_opaque_set NEW.
+ gpgrt_opaque_get NEW.
+ gpgrt_fname_set NEW.
+ gpgrt_fname_get NEW.
+ gpgrt_asprintf NEW.
+ gpgrt_vasprintf NEW.
+ gpgrt_bsprintf NEW.
+ gpgrt_vbsprintf NEW.
+ gpgrt_snprintf NEW.
+ gpgrt_vsnprintf NEW.
+
+
+Noteworthy changes in version 1.13 (2014-04-15) [C11/A11/R0]
-----------------------------------------------
* Added a portable mutex API.
@@ -146,8 +519,8 @@ Noteworthy changes in version 1.4 (2006-09-14)
* New error codes for the Assuan IPC library.
* New error code GPG_ERR_MISSING_ERRNO to be used in cases when a
- system accidently does not set errno but a system error definitely
- occured.
+ system accidentally does not set errno but a system error
+ definitely occurred.
* New error source GPG_ERR_SOURCE_ANY to allow proper use of
libgpg-error even if a specific source is not available.
diff --git a/README b/README
index 3d4640c..fd6e1a8 100644
--- a/README
+++ b/README
@@ -1,11 +1,30 @@
-libgpg-error
-============
+What is Libgpg-error
+====================
+
+Libgpg-error is a library that defines common error values for all
+GnuPG components. Among these are GPG, GPGSM, GPGME, GPG-Agent,
+libgcrypt, Libksba, DirMngr, Pinentry, SmartCard Daemon and more.
+Meanwhile Libgcrypt also sports functions commonly used by all GnuPG
+components and which are believed to be generally useful. The main
+components are
+
+ - Structured error codes and utility functions.
+
+ - Replacement functions for stdio stream (estream) to provide a
+ reliable set of printf features on all platforms. For convenience
+ macros are provided to make migration from stdio to estream easier
+ (ie. the prefix "es_")
-This is a library that defines common error values for all GnuPG
-components. Among these are GPG, GPGSM, GPGME, GPG-Agent, libgcrypt,
-Libksba, DirMngr, Pinentry, SmartCard Daemon and more.
+ - Generic Mutex implementation for all platforms using an ABI
+ independent of the underlying implementation.
-libgpg-error is free software; you can redistribute it and/or modify
+ - A lean gettext and iconv implementation for Windows.
+
+More components will be added over time. Most functions are prefixed
+with "gpgrt" (GnuPG Run Time) instead of "gpg_err" to indicate the
+long term plan to rename this library to gpgrt.
+
+Libgpg-error is free software; you can redistribute it 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. See the file
@@ -13,16 +32,16 @@ COPYING.LIB for copyright and warranty information. See the file
AUTHORS for a list of authors and important mail addresses.
However, some files (for example src/mkerrnos.awk) used in the build
-process of the library are covered by a different license. Please see
-the header of these files and the file COPYING for copyright and
-warranty information on these files. A special exception in the
-copyright license of these files makes sure that the output in the
-build process, which is used in libgpg-error, is not affected by the
-GPL.
+process of the library and the manual are covered by a different
+license. Please see the header of these files and the file COPYING
+for copyright and warranty information on these files. A special
+exception in the copyright license of these files makes sure that the
+output in the build process, which is used in libgpg-error, is not
+affected by the GPL.
Installation
-------------
+============
Please read the file INSTALL!
@@ -45,7 +64,7 @@ Here is a quick summary:
How to Verify the Source
-------------------------
+========================
In order to check that the version of libgpg-error which you are going
to install is an original and unmodified copy of the original, you can
@@ -54,10 +73,11 @@ do it in one of the following ways:
a) If you already have a trusted version of GnuPG installed, you can
simply check the supplied signature:
- $ gpg --verify libgpg-error-x.y.tar.bz2.sig
+ $ gpg --verify libgpg-error-x.y.tar.bz2.sig libgpg-error-x.y.tar.bz2
This checks that the detached signature libgpg-error-x.y.tar.bz2.sig
- is indeed a a signature of libgpg-error-x.y.tar.bz2.
+ is indeed a signature of libgpg-error-x.y.tar.bz2. Make sure that
+ the signature has been created by a trusted keys.
Please note that you have to use an old version of GnuPG to do all
this stuff. *Never* use the version which was built using the
@@ -78,7 +98,7 @@ b) If you don't have any a trusted version of GnuPG, you can attempt
Hints
------
+=====
To build for Windows you you may use the convenience command:
@@ -96,7 +116,7 @@ version:
Cross-Compiling
----------------
+===============
Libgpg-error needs to figure out some platform specific properties.
These are used to build the platform specific gpg-error.h file. The
@@ -115,12 +135,14 @@ need to figure out these values. You may use these commands:
If you are using a VPATH build adjust accordingly. If this all works
for you (make sure to run the test programs on the target platform),
please send the generated file to the gnupg-devel mailing list so that
-we can include it in the next release.
+we can include it in the next release. Note that in addition to the
+aliasing done by config.sub the src/mkheader build tool does some
+extra aliasing to avoid having too much identical syscfg files.
Known Problems
---------------
+==============
On Windows, WSA Error Codes can be provided as system error codes and
will be transparently converted to the corresponding gpg error codes.
@@ -137,9 +159,9 @@ There are two problems with this support:
translations).
* The translation to a gpg error code and back to a system error code
- in some cases does not preserve information. For example, the error code
- WSAEACCES translates to GPG_ERR_EACCES, which translates back to
- EACCES.
+ in some cases does not preserve information. For example, the error
+ code WSAEACCES translates to GPG_ERR_EACCES, which translates back
+ to EACCES.
Any WSA Error code has either the first problem or the second (but not
both), depending on if there is a corresponding Windows error code.
diff --git a/THANKS b/THANKS
index 9250249..9f37446 100644
--- a/THANKS
+++ b/THANKS
@@ -1,5 +1,5 @@
-Albrecht Dreß albrecht.dress at arcor de
+Albrecht Dreß albrecht.dress at arcor de
Guillaume Libersat glibersat at hurdfr org
Jakub Bogusz qboosh at pld-linux org
Petr Pisar petr.pisar at atlas cz
diff --git a/VERSION b/VERSION
index d3456a9..b0c101e 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.13
+1.27
diff --git a/aclocal.m4 b/aclocal.m4
index b267e70..a21574b 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,8 +1,7 @@
-# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -12,16 +11,17 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
[m4_warning([this file was generated for autoconf 2.69.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
-# intlmacosx.m4 serial 3 (gettext-0.18)
-dnl Copyright (C) 2004-2010 Free Software Foundation, Inc.
+# intlmacosx.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2004-2014 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.
@@ -35,35 +35,40 @@ 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 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.2.
AC_CACHE_CHECK([for 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.])
+ [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.
+ dnl Check for API introduced in Mac OS X 10.3.
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.])
+ [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
fi
INTL_MACOSX_LIBS=
if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
@@ -72,25 +77,136 @@ AC_DEFUN([gt_INTL_MACOSX],
AC_SUBST([INTL_MACOSX_LIBS])
])
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
+# longlong.m4 serial 17
+dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+ [ac_cv_type_long_long_int=yes
+ if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+ ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+ if test $ac_cv_type_long_long_int = yes; then
+ dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+ dnl If cross compiling, assume the bug is not important, since
+ dnl nobody cross compiles for this platform as far as we know.
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <limits.h>
+ @%:@ifndef LLONG_MAX
+ @%:@ define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ @%:@ define LLONG_MAX (HALF - 1 + HALF)
+ @%:@endif]],
+ [[long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;]])],
+ [],
+ [ac_cv_type_long_long_int=no],
+ [:])
+ fi
+ fi])
+ if test $ac_cv_type_long_long_int = yes; then
+ AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'long long int'.])
+ fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [ac_cv_type_unsigned_long_long_int=yes
+ if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+ AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [],
+ [ac_cv_type_unsigned_long_long_int=no])
+ fi])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'unsigned long long int'.])
+ fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+ AC_LANG_PROGRAM(
+ [[/* For now, do not test the preprocessor; as of 2007 there are too many
+ implementations with broken preprocessors. Perhaps this can
+ be revisited in 2012. In the meantime, code should not expect
+ #if to work with literals wider than 32 bits. */
+ /* Test literals. */
+ long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ unsigned long long int ull = 18446744073709551615ULL;
+ /* Test constant expressions. */
+ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[/* Test availability of runtime routines for shift and division. */
+ long long int llmax = 9223372036854775807ll;
+ unsigned long long int ullmax = 18446744073709551615ull;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll)
+ | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+ | (ullmax / ull) | (ullmax % ull));]])
+])
+
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
-
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
+[am__api_version='1.14'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.6], [],
+m4_if([$1], [1.14.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -106,24 +222,22 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.6])dnl
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
-
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
@@ -142,7 +256,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
+# harmless because $srcdir is '.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -160,30 +274,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 9
-
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])dnl
AC_SUBST([$1_FALSE])dnl
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -202,16 +312,14 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 12
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
@@ -221,7 +329,7 @@ fi])])
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -234,12 +342,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
-ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
- [$1], CXX, [depcc="$CXX" am_compiler_list=],
- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
- [$1], UPC, [depcc="$UPC" am_compiler_list=],
- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
- [depcc="$$1" am_compiler_list=])
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
@@ -247,8 +356,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
@@ -288,16 +397,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
am__obj=sub/conftest.${OBJEXT-o}
am__minus_obj="-o $am__obj"
case $depmode in
@@ -306,8 +415,8 @@ AC_CACHE_CHECK([dependency style of $depcc],
test "$am__universal" = false || continue
;;
nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
if test "x$enable_dependency_tracking" = xyes; then
continue
else
@@ -315,7 +424,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
fi
;;
msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
+ # This compiler won't grok '-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
am__obj=conftest.${OBJEXT-o}
@@ -363,7 +472,7 @@ AM_CONDITIONAL([am__fastdep$1], [
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -373,9 +482,13 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[ --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors])
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
@@ -390,20 +503,18 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-#serial 5
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[{
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
case $CONFIG_FILES in
@@ -416,7 +527,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
+ # We used to match only the files named 'Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
@@ -428,21 +539,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
+ # from the Makefile without running 'make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
+ test -z "$am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
@@ -460,7 +569,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
-# is enabled. FIXME. This creates each `.P' file that we will
+# is enabled. FIXME. This creates each '.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
@@ -470,18 +579,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 16
-
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
@@ -494,7 +606,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
+[AC_PREREQ([2.65])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -523,31 +635,40 @@ AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
@@ -558,34 +679,79 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
- [_AM_DEPENDENCIES(CC)],
- [define([AC_PROG_CC],
- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [_AM_DEPENDENCIES(CXX)],
- [define([AC_PROG_CXX],
- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
- [_AM_DEPENDENCIES(OBJC)],
- [define([AC_PROG_OBJC],
- defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
AC_CONFIG_COMMANDS_PRE(dnl
[m4_provide_if([_AM_COMPILER_EXEEXT],
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
])
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
dnl mangled by Autoconf and run in a shell conditional statement.
m4_define([_AC_COMPILER_EXEEXT],
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
@@ -607,15 +773,12 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
-
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
@@ -629,16 +792,14 @@ if test x"${install_sh}" != xset; then
install_sh="\${SHELL} $am_aux_dir/install-sh"
esac
fi
-AC_SUBST(install_sh)])
+AC_SUBST([install_sh])])
-# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
@@ -655,20 +816,17 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
-
# AM_MAINTAINER_MODE([DEFAULT-MODE])
# ----------------------------------
# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well. Anyway, the user
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
# can override the default with the --enable/--disable switch.
AC_DEFUN([AM_MAINTAINER_MODE],
[m4_case(m4_default([$1], [disable]),
@@ -679,10 +837,11 @@ AC_DEFUN([AM_MAINTAINER_MODE],
AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
AC_ARG_ENABLE([maintainer-mode],
-[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
- (and sometimes confusing) to the casual installer],
- [USE_MAINTAINER_MODE=$enableval],
- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
@@ -690,18 +849,14 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
]
)
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 4
-
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
@@ -719,7 +874,7 @@ am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
case `$am_make -s -f confmf 2> /dev/null` in #(
*the\ am__doit\ target*)
am__include=include
@@ -744,52 +899,14 @@ AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
- [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 6
-
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
@@ -797,11 +914,10 @@ AC_DEFUN([AM_MISSING_PROG],
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
-
# AM_MISSING_HAS_RUN
# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl
@@ -814,54 +930,22 @@ if test x"${MISSING+set}" != xset; then
esac
fi
# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
else
am_missing_run=
- AC_MSG_WARN([`missing' script is too old or missing])
+ AC_MSG_WARN(['missing' script is too old or missing])
fi
])
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
- [[\\/$]]* | ?:[[\\/]]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
-
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
@@ -871,7 +955,7 @@ AC_DEFUN([_AM_MANGLE_OPTION],
# --------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
# _AM_SET_OPTIONS(OPTIONS)
# ------------------------
@@ -885,24 +969,82 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Check to make sure that the build environment is sane. -*- Autoconf -*-
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -913,32 +1055,40 @@ case `pwd` in
esac
case $srcdir in
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
- AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
esac
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
-alias in your environment])
- fi
-
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
test "$[2]" = conftest.file
)
then
@@ -948,31 +1098,50 @@ else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
-AC_MSG_RESULT(yes)])
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
-# Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# AM_SILENT_RULES([DEFAULT])
# --------------------------
# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
+# ("yes" being less verbose, "no" or empty being verbose).
AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[ --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
esac
dnl
-dnl A few `make' implementations (e.g., NonStop OS and NextStep)
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
dnl do not support nested variable expansions.
dnl See automake bug#9928 and bug#10237.
am_make=${MAKE-make}
@@ -990,7 +1159,7 @@ else
am_cv_make_support_nested_variables=no
fi])
if test $am_cv_make_support_nested_variables = yes; then
- dnl Using `$V' instead of `$(V)' breaks IRIX make.
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
AM_V='$(V)'
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
else
@@ -1007,44 +1176,40 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
-
# AM_PROG_INSTALL_STRIP
# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
+# One issue with vendor 'install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
+# always use install-sh in "make install-strip", and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 3
-
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
@@ -1058,18 +1223,16 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
@@ -1079,81 +1242,120 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
+#
AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility. Yes, it's still used
# in the wild :-( We should find a proper way to deprecate it ...
AC_SUBST([AMTAR], ['$${TAR-tar}'])
-m4_if([$1], [v7],
- [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
- [m4_case([$1], [ustar],, [pax],,
- [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
+
+# We'll loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
- case $_am_tool in
- gnutar)
- for _am_tar in tar gnutar gtar;
- do
- AM_RUN_LOG([$_am_tar --version]) && break
- done
- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
- am__untar="$_am_tar -xf -"
- ;;
- plaintar)
- # Must skip GNU tar: if it does not support --format= it doesn't create
- # ustar tarball either.
- (tar --version) >/dev/null 2>&1 && continue
- am__tar='tar chf - "$$tardir"'
- am__tar_='tar chf - "$tardir"'
- am__untar='tar xf -'
- ;;
- pax)
- am__tar='pax -L -x $1 -w "$$tardir"'
- am__tar_='pax -L -x $1 -w "$tardir"'
- am__untar='pax -r'
- ;;
- cpio)
- am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
- am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
- am__untar='cpio -i -H $1 -d'
- ;;
- none)
- am__tar=false
- am__tar_=false
- am__untar=false
- ;;
- esac
- # If the value was cached, stop now. We just wanted to have am__tar
- # and am__untar set.
- test -n "${am_cv_prog_tar_$1}" && break
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
- # tar/untar a dummy directory, and stop if the command works
- rm -rf conftest.dir
- mkdir conftest.dir
- echo GrepMe > conftest.dir/file
- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
rm -rf conftest.dir
- if test -s conftest.tar; then
- AM_RUN_LOG([$am__untar <conftest.tar])
- grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
- fi
-done
-rm -rf conftest.dir
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
m4_include([m4/autobuild.m4])
+m4_include([m4/estream.m4])
m4_include([m4/gettext.m4])
m4_include([m4/iconv.m4])
m4_include([m4/lib-ld.m4])
diff --git a/autogen.rc b/autogen.rc
index a9cf145..b128361 100644
--- a/autogen.rc
+++ b/autogen.rc
@@ -1,5 +1,7 @@
# autogen.sh configuration for libgpg-error -*- sh -*-
+version_parts=2
+
case "$myhost:$myhostsub" in
w32:ce)
extraoptions=
diff --git a/autogen.sh b/autogen.sh
index 471193c..e5ba5bf 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,6 +1,6 @@
#! /bin/sh
# autogen.sh
-# Copyright (C) 2003, 2014 g10 Code GmbH
+# Copyright (C) 2003, 2014, 2017 g10 Code GmbH
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
@@ -15,7 +15,7 @@
# configure it for the respective package. It is maintained as part of
# GnuPG and source copied by other packages.
#
-# Version: 2014-01-10
+# Version: 2017-01-17
configure_ac="configure.ac"
@@ -41,7 +41,7 @@ fatal () {
info () {
if [ -z "${SILENT}" ]; then
- echo "autogen.sh:" "$*"
+ echo "autogen.sh:" "$*" >&2
fi
}
@@ -70,14 +70,27 @@ MSGMERGE=${GETTEXT_PREFIX}${MSGMERGE:-msgmerge}${GETTEXT_SUFFIX}
DIE=no
FORCE=
SILENT=
+PRINT_HOST=no
+PRINT_BUILD=no
tmp=$(dirname "$0")
tsdir=$(cd "${tmp}"; pwd)
+version_parts=3
if [ -n "${AUTOGEN_SH_SILENT}" ]; then
SILENT=" --silent"
fi
if test x"$1" = x"--help"; then
- echo "usage: ./autogen.sh [--silent] [--force] [--build-TYPE] [ARGS]"
+ echo "usage: ./autogen.sh [OPTIONS] [ARGS]"
+ echo " Options:"
+ echo " --silent Silent operation"
+ echo " --force Pass --force to autoconf"
+ echo " --find-version Helper for configure.ac"
+ echo " --build-TYPE Configure to cross build for TYPE"
+ echo " --print-host Print only the host triplet"
+ echo " --print-build Print only the build platform triplet"
+ echo ""
+ echo " ARGS are passed to configure in --build-TYPE mode."
+ echo " Configuration for this script is expected in autogen.rc"
exit 0
fi
if test x"$1" = x"--silent"; then
@@ -88,6 +101,14 @@ if test x"$1" = x"--force"; then
FORCE=" --force"
shift
fi
+if test x"$1" = x"--print-host"; then
+ PRINT_HOST=yes
+ shift
+fi
+if test x"$1" = x"--print-build"; then
+ PRINT_BUILD=yes
+ shift
+fi
# Reject unsafe characters in $HOME, $tsdir and cwd. We consider spaces
@@ -133,6 +154,11 @@ amd64_toolprefixes=
myhost=""
myhostsub=""
case "$1" in
+ --find-version)
+ myhost="find-version"
+ SILENT=" --silent"
+ shift
+ ;;
--build-w32)
myhost="w32"
shift
@@ -172,16 +198,81 @@ if [ -f "$HOME/.gnupg-autogen.rc" ]; then
. "$HOME/.gnupg-autogen.rc"
fi
+
+# **** FIND VERSION ****
+# This is a helper for the configure.ac M4 magic
+# Called
+# ./autogen.sh --find-version PACKAGE MAJOR MINOR [MICRO]
+# returns a complete version string with automatic beta numbering.
+if [ "$myhost" = "find-version" ]; then
+ package="$1"
+ major="$2"
+ minor="$3"
+ micro="$4"
+
+ if [ -z "$package" -o -z "$major" -o -z "$minor" ]; then
+ echo "usage: ./autogen.sh --find-version PACKAGE MAJOR MINOR [MICRO]" >&2
+ exit 1
+ fi
+
+ case "$version_parts" in
+ 2)
+ matchstr1="$package-$major.[0-9]*"
+ matchstr2="$package-$major-base"
+ vers="$major.$minor"
+ ;;
+ *)
+ matchstr1="$package-$major.$minor.[0-9]*"
+ matchstr2="$package-$major.$minor-base"
+ vers="$major.$minor.$micro"
+ ;;
+ esac
+
+ beta=no
+ if [ -e .git ]; then
+ ingit=yes
+ tmp=$(git describe --match "${matchstr1}" --long 2>/dev/null)
+ tmp=$(echo "$tmp" | sed s/^"$package"//)
+ if [ -n "$tmp" ]; then
+ tmp=$(echo "$tmp" | sed s/^"$package"// \
+ | awk -F- '$3!=0 && $3 !~ /^beta/ {print"-beta"$3}')
+ else
+ tmp=$(git describe --match "${matchstr2}" --long 2>/dev/null \
+ | awk -F- '$4!=0{print"-beta"$4}')
+ fi
+ [ -n "$tmp" ] && beta=yes
+ rev=$(git rev-parse --short HEAD | tr -d '\n\r')
+ rvd=$((0x$(echo ${rev} | dd bs=1 count=4 2>/dev/null)))
+ else
+ ingit=no
+ beta=yes
+ tmp="-unknown"
+ rev="0000000"
+ rvd="0"
+ fi
+
+ echo "$package-$vers$tmp:$beta:$ingit:$vers$tmp:$vers:$tmp:$rev:$rvd:"
+ exit 0
+fi
+# **** end FIND VERSION ****
+
+
+if [ ! -f "$tsdir/build-aux/config.guess" ]; then
+ fatal "$tsdir/build-aux/config.guess not found"
+ exit 1
+fi
+build=`$tsdir/build-aux/config.guess`
+if [ $PRINT_BUILD = yes ]; then
+ echo "$build"
+ exit 0
+fi
+
+
+
# ******************
# W32 build script
# ******************
if [ "$myhost" = "w32" ]; then
- if [ ! -f "$tsdir/build-aux/config.guess" ]; then
- fatal "$tsdir/build-aux/config.guess not found"
- exit 1
- fi
- build=`$tsdir/build-aux/config.guess`
-
case $myhostsub in
ce)
w32root="$w32ce_root"
@@ -222,6 +313,10 @@ if [ "$myhost" = "w32" ]; then
fi
die_p
fi
+ if [ $PRINT_HOST = yes ]; then
+ echo "$host"
+ exit 0
+ fi
if [ -f "$tsdir/config.log" ]; then
if ! head $tsdir/config.log | grep "$host" >/dev/null; then
@@ -232,7 +327,8 @@ if [ "$myhost" = "w32" ]; then
$tsdir/configure --enable-maintainer-mode ${SILENT} \
--prefix=${w32root} \
- --host=${host} --build=${build} \
+ --host=${host} --build=${build} SYSROOT=${w32root} \
+ PKG_CONFIG_LIBDIR=${w32root}/lib/pkgconfig \
${configure_opts} ${extraoptions} "$@"
rc=$?
exit $rc
@@ -242,13 +338,6 @@ fi
# ***** AMD64 cross build script *******
# Used to cross-compile for AMD64 (for testing)
if [ "$myhost" = "amd64" ]; then
- shift
- if [ ! -f $tsdir/build-aux/config.guess ]; then
- echo "$tsdir/build-aux/config.guess not found" >&2
- exit 1
- fi
- build=`$tsdir/build-aux/config.guess`
-
[ -z "$amd64root" ] && amd64root="$HOME/amd64root"
info "Using $amd64root as standard install directory"
replace_sysroot
@@ -269,6 +358,10 @@ if [ "$myhost" = "amd64" ]; then
echo "Stop." >&2
exit 1
fi
+ if [ $PRINT_HOST = yes ]; then
+ echo "$host"
+ exit 0
+ fi
if [ -f "$tsdir/config.log" ]; then
if ! head $tsdir/config.log | grep "$host" >/dev/null; then
@@ -341,13 +434,16 @@ fi
# Check the git setup.
if [ -d .git ]; then
- CP="cp -a"
- [ -z "${SILENT}" ] && CP="$CP -v"
+ CP="cp -p"
+ # If we have a GNU cp we can add -v
+ if cp --version >/dev/null 2>/dev/null; then
+ [ -z "${SILENT}" ] && CP="$CP -v"
+ fi
if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
[ -z "${SILENT}" ] && cat <<EOF
*** Activating trailing whitespace git pre-commit hook. ***
For more information see this thread:
- http://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00084html
+ https://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00084.html
To deactivate this pre-commit hook again move .git/hooks/pre-commit
and .git/hooks/pre-commit.sample out of the way.
EOF
diff --git a/build-aux/compile b/build-aux/compile
index 531136b..52f8f94 100755
--- a/build-aux/compile
+++ b/build-aux/compile
@@ -17,7 +17,7 @@ scriptversion=2012-10-14.11; # UTC
# 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/>.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
diff --git a/build-aux/config.guess b/build-aux/config.guess
index 9afd676..c4bd827 100755
--- a/build-aux/config.guess
+++ b/build-aux/config.guess
@@ -1,8 +1,8 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright 1992-2016 Free Software Foundation, Inc.
-timestamp='2013-11-29'
+timestamp='2016-05-15'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-11-29'
# program. This Exception is an additional permission under section 7
# of the GNU General Public License, version 3 ("GPLv3").
#
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
#
# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
#
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
LIBC=gnu
#endif
EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
;;
esac
@@ -168,19 +168,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || \
+ echo unknown)`
case "${UNAME_MACHINE_ARCH}" in
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
sh3eb) machine=sh-unknown ;;
sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
*) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac
# The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
+ # to ELF recently (or will in the future) and ABI.
case "${UNAME_MACHINE_ARCH}" in
+ earm*)
+ os=netbsdelf
+ ;;
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -197,6 +207,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
os=netbsd
;;
esac
+ # Determine ABI tags.
+ case "${UNAME_MACHINE_ARCH}" in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
# The OS release
# Debian GNU/NetBSD machines have a different userland, and
# thus, need a distinct triplet. However, they do not need
@@ -207,13 +224,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
release='-gnu'
;;
*)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
;;
esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
+ echo "${machine}-${os}${release}${abi}"
exit ;;
*:Bitrig:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -223,6 +240,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
exit ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+ exit ;;
*:ekkoBSD:*:*)
echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
exit ;;
@@ -235,6 +256,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:MirBSD:*:*)
echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
exit ;;
+ *:Sortix:*:*)
+ echo ${UNAME_MACHINE}-unknown-sortix
+ exit ;;
alpha:OSF1:*:*)
case $UNAME_RELEASE in
*4.0)
@@ -251,42 +275,42 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
case "$ALPHA_CPU_TYPE" in
"EV4 (21064)")
- UNAME_MACHINE="alpha" ;;
+ UNAME_MACHINE=alpha ;;
"EV4.5 (21064)")
- UNAME_MACHINE="alpha" ;;
+ UNAME_MACHINE=alpha ;;
"LCA4 (21066/21068)")
- UNAME_MACHINE="alpha" ;;
+ UNAME_MACHINE=alpha ;;
"EV5 (21164)")
- UNAME_MACHINE="alphaev5" ;;
+ UNAME_MACHINE=alphaev5 ;;
"EV5.6 (21164A)")
- UNAME_MACHINE="alphaev56" ;;
+ UNAME_MACHINE=alphaev56 ;;
"EV5.6 (21164PC)")
- UNAME_MACHINE="alphapca56" ;;
+ UNAME_MACHINE=alphapca56 ;;
"EV5.7 (21164PC)")
- UNAME_MACHINE="alphapca57" ;;
+ UNAME_MACHINE=alphapca57 ;;
"EV6 (21264)")
- UNAME_MACHINE="alphaev6" ;;
+ UNAME_MACHINE=alphaev6 ;;
"EV6.7 (21264A)")
- UNAME_MACHINE="alphaev67" ;;
+ UNAME_MACHINE=alphaev67 ;;
"EV6.8CB (21264C)")
- UNAME_MACHINE="alphaev68" ;;
+ UNAME_MACHINE=alphaev68 ;;
"EV6.8AL (21264B)")
- UNAME_MACHINE="alphaev68" ;;
+ UNAME_MACHINE=alphaev68 ;;
"EV6.8CX (21264D)")
- UNAME_MACHINE="alphaev68" ;;
+ UNAME_MACHINE=alphaev68 ;;
"EV6.9A (21264/EV69A)")
- UNAME_MACHINE="alphaev69" ;;
+ UNAME_MACHINE=alphaev69 ;;
"EV7 (21364)")
- UNAME_MACHINE="alphaev7" ;;
+ UNAME_MACHINE=alphaev7 ;;
"EV7.9 (21364A)")
- UNAME_MACHINE="alphaev79" ;;
+ UNAME_MACHINE=alphaev79 ;;
esac
# A Pn.n version is a patched version.
# A Vn.n version is a released version.
# A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
exitcode=$?
trap '' 0
@@ -359,16 +383,16 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
exit ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
eval $set_cc_for_build
- SUN_ARCH="i386"
+ SUN_ARCH=i386
# If there is a compiler, see if it is configured for 64-bit objects.
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
# This test works for both compilers.
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
then
- SUN_ARCH="x86_64"
+ SUN_ARCH=x86_64
fi
fi
echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -393,7 +417,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
exit ;;
sun*:*:4.2BSD:*)
UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
case "`/bin/arch`" in
sun3)
echo m68k-sun-sunos${UNAME_RELEASE}
@@ -579,8 +603,9 @@ EOF
else
IBM_ARCH=powerpc
fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
+ if [ -x /usr/bin/lslpp ] ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
@@ -617,13 +642,13 @@ EOF
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
532) # CPU_PA_RISC2_0
case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
esac ;;
esac
fi
@@ -662,11 +687,11 @@ EOF
exit (0);
}
EOF
- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
test -z "$HP_ARCH" && HP_ARCH=hppa
fi ;;
esac
- if [ ${HP_ARCH} = "hppa2.0w" ]
+ if [ ${HP_ARCH} = hppa2.0w ]
then
eval $set_cc_for_build
@@ -679,12 +704,12 @@ EOF
# $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
# => hppa64-hp-hpux11.23
- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
grep -q __LP64__
then
- HP_ARCH="hppa2.0w"
+ HP_ARCH=hppa2.0w
else
- HP_ARCH="hppa64"
+ HP_ARCH=hppa64
fi
fi
echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -789,14 +814,14 @@ EOF
echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
@@ -826,7 +851,7 @@ EOF
*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
exit ;;
- i*:MSYS*:*)
+ *:MSYS*:*)
echo ${UNAME_MACHINE}-pc-msys
exit ;;
i*:windows32*:*)
@@ -878,7 +903,7 @@ EOF
exit ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
exit ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
@@ -901,7 +926,7 @@ EOF
EV68*) UNAME_MACHINE=alphaev68 ;;
esac
objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
arc:Linux:*:* | arceb:Linux:*:*)
@@ -932,6 +957,9 @@ EOF
crisv32:Linux:*:*)
echo ${UNAME_MACHINE}-axis-linux-${LIBC}
exit ;;
+ e2k:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
frv:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
@@ -944,6 +972,9 @@ EOF
ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
+ k1om:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
m32r*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
@@ -969,10 +1000,10 @@ EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
;;
- or1k:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-${LIBC}
exit ;;
- or32:Linux:*:*)
+ or32:Linux:*:* | or1k*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
padre:Linux:*:*)
@@ -1020,7 +1051,7 @@ EOF
echo ${UNAME_MACHINE}-dec-linux-${LIBC}
exit ;;
x86_64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
exit ;;
xtensa*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1099,7 +1130,7 @@ EOF
# uname -m prints for DJGPP always 'pc', but it prints nothing about
# the processor, so we play safe by assuming i586.
# Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configury will decide that
+ # prints for the "djgpp" host, or else GDB configure will decide that
# this is a cross-build.
echo i586-pc-msdosdjgpp
exit ;;
@@ -1248,6 +1279,9 @@ EOF
SX-8R:SUPER-UX:*:*)
echo sx8r-nec-superux${UNAME_RELEASE}
exit ;;
+ SX-ACE:SUPER-UX:*:*)
+ echo sxace-nec-superux${UNAME_RELEASE}
+ exit ;;
Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit ;;
@@ -1261,9 +1295,9 @@ EOF
UNAME_PROCESSOR=powerpc
fi
if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
then
case $UNAME_PROCESSOR in
@@ -1285,7 +1319,7 @@ EOF
exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
UNAME_PROCESSOR=`uname -p`
- if test "$UNAME_PROCESSOR" = "x86"; then
+ if test "$UNAME_PROCESSOR" = x86; then
UNAME_PROCESSOR=i386
UNAME_MACHINE=pc
fi
@@ -1316,7 +1350,7 @@ EOF
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
- if test "$cputype" = "386"; then
+ if test "$cputype" = 386; then
UNAME_MACHINE=i386
else
UNAME_MACHINE="$cputype"
@@ -1358,7 +1392,7 @@ EOF
echo i386-pc-xenix
exit ;;
i*86:skyos:*:*)
- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
exit ;;
i*86:rdos:*:*)
echo ${UNAME_MACHINE}-pc-rdos
@@ -1369,171 +1403,25 @@ EOF
x86_64:VMkernel:*:*)
echo ${UNAME_MACHINE}-unknown-esx
exit ;;
-esac
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
+ amd64:Isilon\ OneFS:*:*)
+ echo x86_64-unknown-onefs
exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
+esac
cat >&2 <<EOF
$0: unable to guess system type
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite
+config.guess and config.sub with the latest versions from:
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
and
- http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
config.guess timestamp = $timestamp
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
index c38b914..b625621 100755
--- a/build-aux/config.rpath
+++ b/build-aux/config.rpath
@@ -2,7 +2,7 @@
# Output a system dependent set of variables, describing how to set the
# run time search path of shared libraries in an executable.
#
-# Copyright 1996-2013 Free Software Foundation, Inc.
+# Copyright 1996-2014 Free Software Foundation, Inc.
# Taken from GNU libtool, 2001
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
#
@@ -367,11 +367,7 @@ else
dgux*)
hardcode_libdir_flag_spec='-L$libdir'
;;
- freebsd2.2*)
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- ;;
- freebsd2*)
+ freebsd2.[01]*)
hardcode_direct=yes
hardcode_minus_L=yes
;;
@@ -548,13 +544,11 @@ case "$host_os" in
dgux*)
library_names_spec='$libname$shrext'
;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
freebsd* | dragonfly*)
- case "$host_os" in
- freebsd[123]*)
- library_names_spec='$libname$shrext$versuffix' ;;
- *)
- library_names_spec='$libname$shrext' ;;
- esac
+ library_names_spec='$libname$shrext'
;;
gnu*)
library_names_spec='$libname$shrext'
diff --git a/build-aux/config.sub b/build-aux/config.sub
index 61cb4bc..9feb73b 100755
--- a/build-aux/config.sub
+++ b/build-aux/config.sub
@@ -1,8 +1,8 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright 1992-2016 Free Software Foundation, Inc.
-timestamp='2013-10-01'
+timestamp='2016-06-20'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-10-01'
# of the GNU General Public License, version 3 ("GPLv3").
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
#
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
@@ -33,7 +33,7 @@ timestamp='2013-10-01'
# Otherwise, we print the canonical config type on stdout and succeed.
# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
# This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases
@@ -53,8 +53,7 @@ timestamp='2013-10-01'
me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
Canonicalize a configuration name.
@@ -68,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +116,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
@@ -255,12 +254,13 @@ case $basic_machine in
| arc | arceb \
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
| avr | avr32 \
+ | ba \
| be32 | be64 \
| bfin \
| c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \
- | epiphany \
- | fido | fr30 | frv \
+ | e2k | epiphany \
+ | fido | fr30 | frv | ft32 \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| hexagon \
| i370 | i860 | i960 | ia64 \
@@ -283,8 +283,10 @@ case $basic_machine in
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipsr5900 | mipsr5900el \
@@ -296,14 +298,14 @@ case $basic_machine in
| nds32 | nds32le | nds32be \
| nios | nios2 | nios2eb | nios2el \
| ns16k | ns32k \
- | open8 \
- | or1k | or32 \
+ | open8 | or1k | or1knd | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
+ | riscv32 | riscv64 \
| rl78 | rx \
| score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -311,6 +313,7 @@ case $basic_machine in
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
| we32k \
| x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
@@ -325,6 +328,9 @@ case $basic_machine in
c6x)
basic_machine=tic6x-unknown
;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
basic_machine=$basic_machine-unknown
os=-none
@@ -370,12 +376,13 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
+ | ba-* \
| be32-* | be64-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* \
| c8051-* | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
- | elxsi-* \
+ | e2k-* | elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
@@ -402,8 +409,10 @@ case $basic_machine in
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipsr5900-* | mipsr5900el-* \
@@ -415,16 +424,18 @@ case $basic_machine in
| nios-* | nios2-* | nios2eb-* | nios2el-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| open8-* \
+ | or1k*-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
+ | riscv32-* | riscv64-* \
| rl78-* | romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
| tahoe-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tile*-* \
@@ -432,6 +443,7 @@ case $basic_machine in
| ubicom32-* \
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
| vax-* \
+ | visium-* \
| we32k-* \
| x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
@@ -508,6 +520,9 @@ case $basic_machine in
basic_machine=i386-pc
os=-aros
;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
aux)
basic_machine=m68k-apple
os=-aux
@@ -628,6 +643,14 @@ case $basic_machine in
basic_machine=m68k-bull
os=-sysv3
;;
+ e500v[12])
+ basic_machine=powerpc-unknown
+ os=$os"spe"
+ ;;
+ e500v[12]-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ os=$os"spe"
+ ;;
ebmon29k)
basic_machine=a29k-amd
os=-ebmon
@@ -769,6 +792,9 @@ case $basic_machine in
basic_machine=m68k-isi
os=-sysv
;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+ ;;
m68knommu)
basic_machine=m68k-unknown
os=-linux
@@ -824,6 +850,10 @@ case $basic_machine in
basic_machine=powerpc-unknown
os=-morphos
;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
msdos)
basic_machine=i386-pc
os=-msdos
@@ -1356,27 +1386,28 @@ case $os in
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
| -sym* | -kopensolaris* | -plan9* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
+ | -aos* | -aros* | -cloudabi* | -sortix* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -bitrig* | -openbsd* | -solidbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* | -cegcc* \
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+ | -onefs* | -tirtos* | -phoenix*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1508,6 +1539,8 @@ case $os in
;;
-nacl*)
;;
+ -ios)
+ ;;
-none)
;;
*)
@@ -1594,9 +1627,6 @@ case $basic_machine in
mips*-*)
os=-elf
;;
- or1k-*)
- os=-elf
- ;;
or32-*)
os=-coff
;;
diff --git a/build-aux/depcomp b/build-aux/depcomp
index 91d4bf8..f0a474c 100755
--- a/build-aux/depcomp
+++ b/build-aux/depcomp
@@ -1,7 +1,7 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2012-10-18.11; # UTC
+scriptversion=2013-05-30.07; # UTC
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
@@ -16,7 +16,7 @@ scriptversion=2012-10-18.11; # UTC
# 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/>.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -251,6 +251,41 @@ hp)
exit 1
;;
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
xlc)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
@@ -517,6 +552,7 @@ $ {
G
p
}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
rm -f "$tmpdepfile"
;;
diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh
index f8c3614..c3bcdc0 100644
--- a/build-aux/ltmain.sh
+++ b/build-aux/ltmain.sh
@@ -24,7 +24,7 @@
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# can be downloaded from https://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -75,8 +75,8 @@
# autoconf: $autoconf_version
#
# Report bugs to <bug-libtool@gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
+# GNU libtool home page: <https://www.gnu.org/software/libtool/>.
+# General help using GNU software: <https://www.gnu.org/gethelp/>.
PROGRAM=libtool
PACKAGE=libtool
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
new file mode 100755
index 0000000..39f48bb
--- /dev/null
+++ b/build-aux/mdate-sh
@@ -0,0 +1,224 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2010-08-21.06; # UTC
+
+# Copyright (C) 1995-2013 Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+fi
+
+case $1 in
+ '')
+ echo "$0: No file. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification day of FILE, in the format:
+1 January 1970
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "mdate-sh $scriptversion"
+ exit $?
+ ;;
+esac
+
+error ()
+{
+ echo "$0: $1" >&2
+ exit 1
+}
+
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# GNU ls changes its time format in response to the TIME_STYLE
+# variable. Since we cannot assume 'unset' works, revert this
+# variable to its documented default.
+if test "${TIME_STYLE+set}" = set; then
+ TIME_STYLE=posix-long-iso
+ export TIME_STYLE
+fi
+
+save_arg1=$1
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+ ls_command='ls -L -l -d'
+else
+ ls_command='ls -l -d'
+fi
+# Avoid user/group names that might have spaces, when possible.
+if ls -n /dev/null 1>/dev/null 2>&1; then
+ ls_command="$ls_command -n"
+fi
+
+# A 'ls -l' line looks as follows on OS/2.
+# drwxrwx--- 0 Aug 11 2001 foo
+# This differs from Unix, which adds ownership information.
+# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month. This cannot work with files whose owner is a
+# user named "Jan", or "Feb", etc. However, it's unlikely that '/'
+# will be owned by a user whose name is a month. So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`$ls_command /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+ test $# -gt 0 || error "failed parsing '$ls_command /' output"
+ shift
+ # Add another shift to the command.
+ command="$command shift;"
+ case $1 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+ esac
+done
+
+test -n "$month" || error "failed parsing '$ls_command /' output"
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\\\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+ Jan) month=January; nummonth=1;;
+ Feb) month=February; nummonth=2;;
+ Mar) month=March; nummonth=3;;
+ Apr) month=April; nummonth=4;;
+ May) month=May; nummonth=5;;
+ Jun) month=June; nummonth=6;;
+ Jul) month=July; nummonth=7;;
+ Aug) month=August; nummonth=8;;
+ Sep) month=September; nummonth=9;;
+ Oct) month=October; nummonth=10;;
+ Nov) month=November; nummonth=11;;
+ Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+ ???*) day=$1;;
+ *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+ *:*) set `date`; eval year=\$$#
+ case $2 in
+ Jan) nummonthtod=1;;
+ Feb) nummonthtod=2;;
+ Mar) nummonthtod=3;;
+ Apr) nummonthtod=4;;
+ May) nummonthtod=5;;
+ Jun) nummonthtod=6;;
+ Jul) nummonthtod=7;;
+ Aug) nummonthtod=8;;
+ Sep) nummonthtod=9;;
+ Oct) nummonthtod=10;;
+ Nov) nummonthtod=11;;
+ Dec) nummonthtod=12;;
+ esac
+ # For the first six month of the year the time notation can also
+ # be used for files modified in the last year.
+ if (expr $nummonth \> $nummonthtod) > /dev/null;
+ then
+ year=`expr $year - 1`
+ fi;;
+ *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
index 894e786..295de3f 100755
--- a/build-aux/missing
+++ b/build-aux/missing
@@ -1,11 +1,10 @@
#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
+# Common wrapper for a few potentially missing GNU programs.
-scriptversion=2005-06-08.21
+scriptversion=2013-10-28.13; # UTC
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -18,9 +17,7 @@ scriptversion=2005-06-08.21
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -28,63 +25,40 @@ scriptversion=2005-06-08.21
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
+ echo 1>&2 "Try '$0 --help' for more information"
exit 1
fi
-run=:
+case $1 in
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
-
-msg="missing on your system"
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
-case "$1" in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- # Exit code 63 means version mismatch. This often happens
- # when the user try to use an ancient version of a tool on
- # a file that requires a minimum version. In this case we
- # we should proceed has if the program had been absent, or
- # if --run hadn't been passed.
- if test $? = 63; then
- run=:
- msg="probably too old"
- fi
- ;;
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- tar try tar, gnutar, gtar, then tar without non-portable flags
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
Send bug reports to <bug-automake@gnu.org>."
exit $?
@@ -96,265 +70,146 @@ Send bug reports to <bug-automake@gnu.org>."
;;
-*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
exit 1
;;
esac
-# Now exit if we have it, but it failed. Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).
-case "$1" in
- lex|yacc)
- # Not GNU programs, they don't have --version.
- ;;
-
- tar)
- if test -n "$run"; then
- echo 1>&2 "ERROR: \`tar' requires --run"
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- exit 1
- fi
- ;;
-
- *)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- # Could not run --version or --help. This is probably someone
- # running `$TOOL --version' or `$TOOL --help' to check whether
- # $TOOL exists and not knowing $TOOL uses missing.
- exit 1
- fi
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case "$1" in
- aclocal*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case "$f" in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te)
- echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
- You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
- test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison|yacc)
- echo 1>&2 "\
-WARNING: \`$1' $msg. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if [ ! -f y.tab.h ]; then
- echo >y.tab.h
- fi
- if [ ! -f y.tab.c ]; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex|flex)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if [ ! -f lex.yy.c ]; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
- fi
- if [ -f "$file" ]; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit 1
- fi
- ;;
-
- makeinfo)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- # The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- # ... or it is the one specified with @setfilename ...
- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
- # ... or it is derived from the source name (dir/f.texi becomes f.info)
- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
- fi
- # If the file does not exist, the user really needs makeinfo;
- # let's fail without touching anything.
- test -f $file || exit 1
- touch $file
- ;;
-
- tar)
- shift
-
- # We have already tried tar in the generic part.
- # Look for gnutar/gtar before invocation to avoid ugly error
- # messages.
- if (gnutar --version > /dev/null 2>&1); then
- gnutar "$@" && exit 0
- fi
- if (gtar --version > /dev/null 2>&1); then
- gtar "$@" && exit 0
- fi
- firstarg="$1"
- if shift; then
- case "$firstarg" in
- *o*)
- firstarg=`echo "$firstarg" | sed s/o//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- case "$firstarg" in
- *h*)
- firstarg=`echo "$firstarg" | sed s/h//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- fi
-
- echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
- You may want to install GNU tar or Free paxutils, or check the
- command line arguments."
- exit 1
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
- You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequisites for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
-exit 0
+perl_URL=https://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
# End:
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
new file mode 100644
index 0000000..b1f0d2e
--- /dev/null
+++ b/build-aux/texinfo.tex
@@ -0,0 +1,8638 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2007-05-03.09}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 3, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that 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 texinfo.tex file; see the file COPYING. If not,
+% see <https://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% https://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see https://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is https://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar = `\-
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ % We don't want .vr (or whatever) entries like this:
+ % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+ % "\acronym" won't work when it's read back in;
+ % it needs to be
+ % {\code {{\tt \backslashcurfont }acronym}
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingyyy.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 24pt
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \indexdummies
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\argtorun{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode`\_ = \active
+ \gdef\mathunderscore{%
+ \catcode`\_=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em. So do
+% whichever is larger.
+%
+\def\dots{%
+ \leavevmode
+ \setbox0=\hbox{...}% get width of three periods
+ \ifdim\wd0 > 1.5em
+ \dimen0 = \wd0
+ \else
+ \dimen0 = 1.5em
+ \fi
+ \hbox to \dimen0{%
+ \hskip 0pt plus.25fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+% https://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+%
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+ @catcode`@\=@active
+ @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters. hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo. It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+%
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+%
+\def\HyPsdSubst#1#2#3{%
+ \def\HyPsdReplace##1#1##2\END{%
+ ##1%
+ \ifx\\##2\\%
+ \else
+ #2%
+ \HyReturnAfterFi{%
+ \HyPsdReplace##2\END
+ }%
+ \fi
+ }%
+ \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+ \xdef#1{#1}% redefine it as its expansion; the definition is simply
+ % \lastnode when called from \setref -> \pdfmkdest.
+ \HyPsdSubst{(}{\realbackslash(}{#1}%
+ \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found. (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+ \input pdfcolor
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+ % others). Let's try in that order.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \openin 1 #1.pdf \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifdim \wd0 >0pt width \imagewidth \fi
+ \ifdim \wd2 >0pt height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \indexnofonts
+ \turnoffactive
+ \activebackslashdouble
+ \makevalueexpandable
+ \def\pdfdestname{#1}%
+ \backslashparens\pdfdestname
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }}
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use a color that is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing.
+ % (Defined in pdfcolor.tex.)
+ \let\urlcolor = \BrickRed
+ \let\linkcolor = \BrickRed
+ \def\endlink{\Black\pdfendlink}
+ %
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ % Doubled backslashes in the name.
+ {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+ \backslashparens\pdfoutlinedest}%
+ \fi
+ %
+ % Also double the backslashes in the display string.
+ {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+ \backslashparens\pdfoutlinetext}%
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \setupdatafile
+ \catcode`\\=\active \otherbackslash
+ \input \jobname.toc
+ \endgroup
+ }
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ % make a live url in pdf output.
+ \def\pdfurl#1{%
+ \begingroup
+ % it seems we really need yet another set of dummies; have not
+ % tried to figure out what each command should do in the context
+ % of @url. for now, just make @/ a no-op, that's the only one
+ % people have actually reported a problem with.
+ %
+ \normalturnoffactive
+ \def\@{@}%
+ \let\/=\empty
+ \makevalueexpandable
+ \leavevmode\urlcolor
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+%
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% \cmapOT1
+\ifpdf
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1IT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1TT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+\else
+ \expandafter\let\csname cmapOT1\endcsname\gobble
+ \expandafter\let\csname cmapOT1IT\endcsname\gobble
+ \expandafter\let\csname cmapOT1TT\endcsname\gobble
+\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+ \font#1=\fontprefix#2#3 scaled #4
+ \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt. This is the default in
+% Texinfo.
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit. This is for the GNU
+% Press printing of the Emacs 22 manual. Maybe other manuals in the
+% future. Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+ \def\textsizearg{#1}%
+ \wlog{doing @fonttextsize \textsizearg}%
+ %
+ % Set \globaldefs so that documents can use this inside @tex, since
+ % makeinfo 4.8 does not support it, but we need it nonetheless.
+ %
+ \begingroup \globaldefs=1
+ \ifx\textsizearg\xword \definetextfontsizex
+ \else \ifx\textsizearg\xiword \definetextfontsizexi
+ \else
+ \errhelp=\EMsimple
+ \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+ \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}{OT1}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+\def\key #1{{\nohyphenation \uppercase{#1}}\null}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active \catcode`\_=\active
+ \catcode`\'=\active \catcode`\`=\active
+ %
+ \global\def\code{\begingroup
+ \catcode\rquoteChar=\active \catcode\lquoteChar=\active
+ \let'\codequoteright \let`\codequoteleft
+ %
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\realdash
+ \let_\realunder
+ \fi
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general. @allowcodebreaks provides a way to control this.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\txiarg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+ \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\txiarg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\txiarg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from https://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbol don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \obeylines
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1'.
+ \long\def\doignoretext##1^^M@end #1{%
+ \doignoretextyyy##1^^M@#1\_STOP_}%
+ %
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+ % Ignore anything after the last `@end #1'; this matters in verbatim
+ % environments, where otherwise the newline after an ignored conditional
+ % would result in a blank line in the output.
+ \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \escapechar = `\\ % use backslash in output files.
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ %
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % I don't entirely understand this, but when an index entry is
+ % generated from a macro call, the \endinput which \scanmacro inserts
+ % causes processing to be prematurely terminated. This is,
+ % apparently, because \indexsorttmp is fully expanded, and \endinput
+ % is an expandable command. The redefinition below makes \endinput
+ % disappear altogether for that purpose -- although logging shows that
+ % processing continues to some further point. On the other hand, it
+ % seems \endinput does not hurt in the printed index arg, since that
+ % is still getting written without apparent harm.
+ %
+ % Sample source (mac-idx3.tex, reported by Graham Percival to
+ % help-texinfo, 22may06):
+ % @macro funindex {WORD}
+ % @findex xyz
+ % @end macro
+ % ...
+ % @funindex commtest
+ %
+ % The above is not enough to reproduce the bug, but it gives the flavor.
+ %
+ % Sample whatsit resulting:
+ % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+ %
+ % So:
+ \let\endinput = \empty
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % Do the redefinitions.
+ \commondummies
+ \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+ %
+ % \definedummyword defines \#1 as \string\#1\space, thus effectively
+ % preventing its expansion. This is used only for control% words,
+ % not control letters, because the \space would be incorrect for
+ % control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword ##1{\def##1{\string##1\space}}%
+ \def\definedummyletter##1{\def##1{\string##1}}%
+ \let\definedummyaccent\definedummyletter
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\L
+ \definedummyword\OE
+ \definedummyword\O
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\l
+ \definedummyword\oe
+ \definedummyword\o
+ \definedummyword\ss
+ \definedummyword\exclamdown
+ \definedummyword\questiondown
+ \definedummyword\ordf
+ \definedummyword\ordm
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword\bf
+ \definedummyword\gtr
+ \definedummyword\hat
+ \definedummyword\less
+ \definedummyword\sf
+ \definedummyword\sl
+ \definedummyword\tclose
+ \definedummyword\tt
+ %
+ \definedummyword\LaTeX
+ \definedummyword\TeX
+ %
+ % Assorted special characters.
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\expansion
+ \definedummyword\minus
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\result
+ \definedummyword\textdegree
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ %
+ \normalturnoffactive
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter\!%
+ \definedummyaccent\"%
+ \definedummyaccent\'%
+ \definedummyletter\*%
+ \definedummyaccent\,%
+ \definedummyletter\.%
+ \definedummyletter\/%
+ \definedummyletter\:%
+ \definedummyaccent\=%
+ \definedummyletter\?%
+ \definedummyaccent\^%
+ \definedummyaccent\`%
+ \definedummyaccent\~%
+ \definedummyword\u
+ \definedummyword\v
+ \definedummyword\H
+ \definedummyword\dotaccent
+ \definedummyword\ringaccent
+ \definedummyword\tieaccent
+ \definedummyword\ubaraccent
+ \definedummyword\udotaccent
+ \definedummyword\dotless
+ %
+ % Texinfo font commands.
+ \definedummyword\b
+ \definedummyword\i
+ \definedummyword\r
+ \definedummyword\sc
+ \definedummyword\t
+ %
+ % Commands that take arguments.
+ \definedummyword\acronym
+ \definedummyword\cite
+ \definedummyword\code
+ \definedummyword\command
+ \definedummyword\dfn
+ \definedummyword\emph
+ \definedummyword\env
+ \definedummyword\file
+ \definedummyword\kbd
+ \definedummyword\key
+ \definedummyword\math
+ \definedummyword\option
+ \definedummyword\pxref
+ \definedummyword\ref
+ \definedummyword\samp
+ \definedummyword\strong
+ \definedummyword\tie
+ \definedummyword\uref
+ \definedummyword\url
+ \definedummyword\var
+ \definedummyword\verb
+ \definedummyword\w
+ \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{\let##1\empty}%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\result{=>}%
+ \def\textdegree{degrees}%
+ %
+ % We need to get rid of all macros, leaving only the arguments (if present).
+ % Of course this is not nearly correct, but it is the best we can do for now.
+ % makeinfo does not expand macros in the argument to @deffn, which ends up
+ % writing an index entry, and texindex isn't prepared for an index sort entry
+ % that starts with \.
+ %
+ % Since macro invocations are followed by braces, we can just redefine them
+ % to take a single TeX argument. The case of a macro invocation that
+ % goes to end-of-line is not handled.
+ %
+ \macrolist
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \safewhatsit\dosubindwrite
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero. The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+ #1%
+\else
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \whatsitskip = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \whatsitpenalty = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\skip0 glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\whatsitskip
+ \fi
+ %
+ #1%
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\whatsitskip
+ \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \plainfrenchspacing
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#1}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ % The following penalty ensures that the page builder is exercised
+ % _before_ we change the output routine. This is necessary in the
+ % following situation:
+ %
+ % The last section of the index consists only of a single entry.
+ % Before this section, \pagetotal is less than \pagegoal, so no
+ % break occurs before the last section starts. However, the last
+ % section, consisting of \initial and the single \entry, does not
+ % fit on the page and has to be broken off. Without the following
+ % penalty the page builder will not be exercised until \eject
+ % below, and by that time we'll already have changed the output
+ % routine to the \balancecolumns version, so the next-to-last
+ % double-column page will be processed with \balancecolumns, which
+ % is wrong: The two columns will go to the main vertical list, with
+ % the broken-off section in the recent contributions. As soon as
+ % the output routine finishes, TeX starts reconsidering the page
+ % break. The two columns and the broken-off section both fit on the
+ % page, because the two columns now take up only half of the page
+ % goal. When TeX sees \eject from below which follows the final
+ % section, it invokes the new output routine that we've set after
+ % \balancecolumns below; \onepageout will try to fit the two columns
+ % and the final section into the vbox of \pageheight (see
+ % \pagebody), causing an overfull box.
+ %
+ % Note that glue won't work here, because glue does not exercise the
+ % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+ \penalty0
+ %
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+% However, they are not reliable, because we don't use marks.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \thissection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \gdef\thischapternum{}%
+ \gdef\thischapter{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \gdef\thischapternum{}%
+ \gdef\thischapter{}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \xdef\thischapternum{\appendixletter}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now. And we don't
+ % use \thissection because that changes with each section.
+ %
+ \xdef\thischapter{\putwordAppendix{} \appendixletter:
+ \noexpand\thischaptername}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \xdef\thischapternum{\the\chapno}%
+ \xdef\thischapter{\putwordChapter{} \the\chapno:
+ \noexpand\thischaptername}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Only insert the space after the number if we have a section number.
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\thissection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \thissection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\thissection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\thissection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chapmacro.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chapmacro.
+ \donoderef{#3}%
+ %
+ % Interline glue will be inserted when the vbox is completed.
+ % That glue will be a valid breakpoint for the page, since it'll be
+ % preceded by a whatsit (usually from the \donoderef, or from the
+ % \writetocentry if there was no node). We don't want to allow that
+ % break, since then the whatsits could end up on page n while the
+ % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
+ \nobreak
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }%
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \jobname.toc
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \def\thischapter{}%
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing = t%
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ % end paragraph for sake of leading, in case document has no blank
+ % line. This is redundant with what happens in \aboveenvbreak, but
+ % we need to do it before changing the fonts, and it's inconvenient
+ % to change the fonts afterward.
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt\quoteexpand
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report. xpdf does work with the
+% regular 0x27.
+%
+\def\codequoteright{%
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else
+ \char'15
+ \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ `%
+ \else
+ \char'22
+ \fi
+}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+ \catcode`\'=\active
+ \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
+ %
+ \catcode`\`=\active
+ \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
+ %
+ \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ \quoteexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \defunpenalty=10003 % Will keep this @deffn together with the
+ % following @def command, see below.
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \printdefunline, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ % As a minor refinement, we avoid "club" headers by signalling
+ % with penalty of 10003 after the very first @deffn in the
+ % sequence (see above), and penalty of 10002 after any following
+ % @def command.
+ \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty\defunpenalty % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+\def\badparencount{%
+ \errmessage{Unbalanced parentheses in @def}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \errmessage{Unbalanced square braces in @def}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+ \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ \addtomacrolist{\the\macname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\definedummyword\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx #1\relax
+ % remove this
+ \else
+ \noexpand\definedummyword \noexpand#1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \addtomacrolist{#1}%
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \thissection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\thissection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\indexnofonts
+ \turnoffactive
+ % See comments at \activebackslashdouble.
+ {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+ \backslashparens\pdfxrefdest}%
+ %
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% The node name might contain 8-bit characters, which in our current
+ % implementation are changed to commands like @'e. Don't let these
+ % mess up the control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR\safexrefname\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+ {\safexrefname}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count1=128
+ \def\loop{%
+ \catcode\count1=\other
+ \advance\count1 by 1
+ \ifnum \count1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \thissection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\thissection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies
+ %
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start floating, we have to issue warning
+ % whenever an insert appears inside a float which could possibly
+ % float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \thissection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+
+\message{localization,}
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \global\catcode\count255=#1
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+ % Encoding being declared for the document.
+ \def\declaredencoding{\csname #1.enc\endcsname}%
+ %
+ % Supported encodings: names converted to tokens in order to be able
+ % to compare them with \ifx.
+ \def\ascii{\csname US-ASCII.enc\endcsname}%
+ \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+ \def\latone{\csname ISO-8859-1.enc\endcsname}%
+ \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+ \def\utfeight{\csname UTF-8.enc\endcsname}%
+ %
+ \ifx \declaredencoding \ascii
+ \asciichardefs
+ %
+ \else \ifx \declaredencoding \lattwo
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \setnonasciicharscatcode\active
+ \utfeightchardefs
+ %
+ \else
+ \message{Unknown document encoding #1, ignoring.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\exclamdown}
+ \gdef^^a2{\missingcharmsg{CENT SIGN}}
+ \gdef^^a3{{\pounds}}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\missingcharmsg{YEN SIGN}}
+ \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\copyright}
+ \gdef^^aa{\ordf}
+ \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^ac{$\lnot$}
+ \gdef^^ad{\-}
+ \gdef^^ae{\registeredsymbol}
+ \gdef^^af{\={}}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{$\pm$}
+ \gdef^^b2{$^2$}
+ \gdef^^b3{$^3$}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{$\mu$}
+ \gdef^^b6{\P}
+ %
+ \gdef^^b7{$^.$}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{$^1$}
+ \gdef^^ba{\ordm}
+ %
+ \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^bc{$1\over4$}
+ \gdef^^bd{$1\over2$}
+ \gdef^^be{$3\over4$}
+ \gdef^^bf{\questiondown}
+ %
+ \gdef^^c0{\`A}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\~A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\ringaccent A}
+ \gdef^^c6{\AE}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\`E}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\^E}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\`I}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\"I}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+ \gdef^^d1{\~N}
+ \gdef^^d2{\`O}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\~O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\O}
+ \gdef^^d9{\`U}
+ \gdef^^da{\'U}
+ \gdef^^db{\^U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\`a}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\~a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\ringaccent a}
+ \gdef^^e6{\ae}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\`e}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\^e}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\`{\dotless i}}
+ \gdef^^ed{\'{\dotless i}}
+ \gdef^^ee{\^{\dotless i}}
+ \gdef^^ef{\"{\dotless i}}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+ \gdef^^f1{\~n}
+ \gdef^^f2{\`o}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\~o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\o}
+ \gdef^^f9{\`u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\^u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+ \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdef^^a4{\euro}
+ \gdef^^a6{\v S}
+ \gdef^^a8{\v s}
+ \gdef^^b4{\v Z}
+ \gdef^^b8{\v z}
+ \gdef^^bc{\OE}
+ \gdef^^bd{\oe}
+ \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+ \gdef^^a2{\u{}}
+ \gdef^^a3{\L}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\v L}
+ \gdef^^a6{\'S}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\v S}
+ \gdef^^aa{\cedilla S}
+ \gdef^^ab{\v T}
+ \gdef^^ac{\'Z}
+ \gdef^^ad{\-}
+ \gdef^^ae{\v Z}
+ \gdef^^af{\dotaccent Z}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
+ \gdef^^b2{\missingcharmsg{OGONEK}}
+ \gdef^^b3{\l}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{\v l}
+ \gdef^^b6{\'s}
+ \gdef^^b7{\v{}}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{\v s}
+ \gdef^^ba{\cedilla s}
+ \gdef^^bb{\v t}
+ \gdef^^bc{\'z}
+ \gdef^^bd{\H{}}
+ \gdef^^be{\v z}
+ \gdef^^bf{\dotaccent z}
+ %
+ \gdef^^c0{\'R}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\u A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\'L}
+ \gdef^^c6{\'C}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\v C}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\v E}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\v D}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}}
+ \gdef^^d1{\'N}
+ \gdef^^d2{\v N}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\H O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\v R}
+ \gdef^^d9{\ringaccent U}
+ \gdef^^da{\'U}
+ \gdef^^db{\H U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\cedilla T}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\'r}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\u a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\'l}
+ \gdef^^e6{\'c}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\v c}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\v e}
+ \gdef^^ed{\'\i}
+ \gdef^^ee{\^\i}
+ \gdef^^ef{\v d}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}}
+ \gdef^^f1{\'n}
+ \gdef^^f2{\v n}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\H o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\v r}
+ \gdef^^f9{\ringaccent u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\H u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\cedilla t}
+ \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions. It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+ \ifx #1\relax
+ \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+ \else
+ \expandafter #1%
+ \fi
+}
+
+\begingroup
+ \catcode`\~13
+ \catcode`\"12
+
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+ \UTFviiiLoop
+\endgroup
+
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+
+ \gdef\DeclareUnicodeCharacter#1#2{%
+ \countUTFz = "#1\relax
+ \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+ \begingroup
+ \parseXMLCharref
+ \def\UTFviiiTwoOctets##1##2{%
+ \csname u8:##1\string ##2\endcsname}%
+ \def\UTFviiiThreeOctets##1##2##3{%
+ \csname u8:##1\string ##2\string ##3\endcsname}%
+ \def\UTFviiiFourOctets##1##2##3##4{%
+ \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \gdef\UTFviiiTmp{#2}%
+ \endgroup}
+
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \fi\fi\fi
+ }
+
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz
+ \multiply\countUTFz by 64
+ \advance\countUTFx by -\countUTFz
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}
+ \DeclareUnicodeCharacter{00A3}{\pounds}
+ \DeclareUnicodeCharacter{00A8}{\"{ }}
+ \DeclareUnicodeCharacter{00A9}{\copyright}
+ \DeclareUnicodeCharacter{00AA}{\ordf}
+ \DeclareUnicodeCharacter{00AD}{\-}
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+ \DeclareUnicodeCharacter{00AF}{\={ }}
+
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+ \DeclareUnicodeCharacter{00B4}{\'{ }}
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+ \DeclareUnicodeCharacter{00BA}{\ordm}
+ \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+ \DeclareUnicodeCharacter{00C0}{\`A}
+ \DeclareUnicodeCharacter{00C1}{\'A}
+ \DeclareUnicodeCharacter{00C2}{\^A}
+ \DeclareUnicodeCharacter{00C3}{\~A}
+ \DeclareUnicodeCharacter{00C4}{\"A}
+ \DeclareUnicodeCharacter{00C5}{\AA}
+ \DeclareUnicodeCharacter{00C6}{\AE}
+ \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+ \DeclareUnicodeCharacter{00C8}{\`E}
+ \DeclareUnicodeCharacter{00C9}{\'E}
+ \DeclareUnicodeCharacter{00CA}{\^E}
+ \DeclareUnicodeCharacter{00CB}{\"E}
+ \DeclareUnicodeCharacter{00CC}{\`I}
+ \DeclareUnicodeCharacter{00CD}{\'I}
+ \DeclareUnicodeCharacter{00CE}{\^I}
+ \DeclareUnicodeCharacter{00CF}{\"I}
+
+ \DeclareUnicodeCharacter{00D1}{\~N}
+ \DeclareUnicodeCharacter{00D2}{\`O}
+ \DeclareUnicodeCharacter{00D3}{\'O}
+ \DeclareUnicodeCharacter{00D4}{\^O}
+ \DeclareUnicodeCharacter{00D5}{\~O}
+ \DeclareUnicodeCharacter{00D6}{\"O}
+ \DeclareUnicodeCharacter{00D8}{\O}
+ \DeclareUnicodeCharacter{00D9}{\`U}
+ \DeclareUnicodeCharacter{00DA}{\'U}
+ \DeclareUnicodeCharacter{00DB}{\^U}
+ \DeclareUnicodeCharacter{00DC}{\"U}
+ \DeclareUnicodeCharacter{00DD}{\'Y}
+ \DeclareUnicodeCharacter{00DF}{\ss}
+
+ \DeclareUnicodeCharacter{00E0}{\`a}
+ \DeclareUnicodeCharacter{00E1}{\'a}
+ \DeclareUnicodeCharacter{00E2}{\^a}
+ \DeclareUnicodeCharacter{00E3}{\~a}
+ \DeclareUnicodeCharacter{00E4}{\"a}
+ \DeclareUnicodeCharacter{00E5}{\aa}
+ \DeclareUnicodeCharacter{00E6}{\ae}
+ \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+ \DeclareUnicodeCharacter{00E8}{\`e}
+ \DeclareUnicodeCharacter{00E9}{\'e}
+ \DeclareUnicodeCharacter{00EA}{\^e}
+ \DeclareUnicodeCharacter{00EB}{\"e}
+ \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+ \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{00F1}{\~n}
+ \DeclareUnicodeCharacter{00F2}{\`o}
+ \DeclareUnicodeCharacter{00F3}{\'o}
+ \DeclareUnicodeCharacter{00F4}{\^o}
+ \DeclareUnicodeCharacter{00F5}{\~o}
+ \DeclareUnicodeCharacter{00F6}{\"o}
+ \DeclareUnicodeCharacter{00F8}{\o}
+ \DeclareUnicodeCharacter{00F9}{\`u}
+ \DeclareUnicodeCharacter{00FA}{\'u}
+ \DeclareUnicodeCharacter{00FB}{\^u}
+ \DeclareUnicodeCharacter{00FC}{\"u}
+ \DeclareUnicodeCharacter{00FD}{\'y}
+ \DeclareUnicodeCharacter{00FF}{\"y}
+
+ \DeclareUnicodeCharacter{0100}{\=A}
+ \DeclareUnicodeCharacter{0101}{\=a}
+ \DeclareUnicodeCharacter{0102}{\u{A}}
+ \DeclareUnicodeCharacter{0103}{\u{a}}
+ \DeclareUnicodeCharacter{0106}{\'C}
+ \DeclareUnicodeCharacter{0107}{\'c}
+ \DeclareUnicodeCharacter{0108}{\^C}
+ \DeclareUnicodeCharacter{0109}{\^c}
+ \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+ \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+ \DeclareUnicodeCharacter{010C}{\v{C}}
+ \DeclareUnicodeCharacter{010D}{\v{c}}
+ \DeclareUnicodeCharacter{010E}{\v{D}}
+
+ \DeclareUnicodeCharacter{0112}{\=E}
+ \DeclareUnicodeCharacter{0113}{\=e}
+ \DeclareUnicodeCharacter{0114}{\u{E}}
+ \DeclareUnicodeCharacter{0115}{\u{e}}
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+ \DeclareUnicodeCharacter{011A}{\v{E}}
+ \DeclareUnicodeCharacter{011B}{\v{e}}
+ \DeclareUnicodeCharacter{011C}{\^G}
+ \DeclareUnicodeCharacter{011D}{\^g}
+ \DeclareUnicodeCharacter{011E}{\u{G}}
+ \DeclareUnicodeCharacter{011F}{\u{g}}
+
+ \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+ \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+ \DeclareUnicodeCharacter{0124}{\^H}
+ \DeclareUnicodeCharacter{0125}{\^h}
+ \DeclareUnicodeCharacter{0128}{\~I}
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+ \DeclareUnicodeCharacter{012A}{\=I}
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+ \DeclareUnicodeCharacter{012C}{\u{I}}
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}
+ \DeclareUnicodeCharacter{0132}{IJ}
+ \DeclareUnicodeCharacter{0133}{ij}
+ \DeclareUnicodeCharacter{0134}{\^J}
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+ \DeclareUnicodeCharacter{0139}{\'L}
+ \DeclareUnicodeCharacter{013A}{\'l}
+
+ \DeclareUnicodeCharacter{0141}{\L}
+ \DeclareUnicodeCharacter{0142}{\l}
+ \DeclareUnicodeCharacter{0143}{\'N}
+ \DeclareUnicodeCharacter{0144}{\'n}
+ \DeclareUnicodeCharacter{0147}{\v{N}}
+ \DeclareUnicodeCharacter{0148}{\v{n}}
+ \DeclareUnicodeCharacter{014C}{\=O}
+ \DeclareUnicodeCharacter{014D}{\=o}
+ \DeclareUnicodeCharacter{014E}{\u{O}}
+ \DeclareUnicodeCharacter{014F}{\u{o}}
+
+ \DeclareUnicodeCharacter{0150}{\H{O}}
+ \DeclareUnicodeCharacter{0151}{\H{o}}
+ \DeclareUnicodeCharacter{0152}{\OE}
+ \DeclareUnicodeCharacter{0153}{\oe}
+ \DeclareUnicodeCharacter{0154}{\'R}
+ \DeclareUnicodeCharacter{0155}{\'r}
+ \DeclareUnicodeCharacter{0158}{\v{R}}
+ \DeclareUnicodeCharacter{0159}{\v{r}}
+ \DeclareUnicodeCharacter{015A}{\'S}
+ \DeclareUnicodeCharacter{015B}{\'s}
+ \DeclareUnicodeCharacter{015C}{\^S}
+ \DeclareUnicodeCharacter{015D}{\^s}
+ \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+ \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+ \DeclareUnicodeCharacter{0160}{\v{S}}
+ \DeclareUnicodeCharacter{0161}{\v{s}}
+ \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+ \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+ \DeclareUnicodeCharacter{0164}{\v{T}}
+
+ \DeclareUnicodeCharacter{0168}{\~U}
+ \DeclareUnicodeCharacter{0169}{\~u}
+ \DeclareUnicodeCharacter{016A}{\=U}
+ \DeclareUnicodeCharacter{016B}{\=u}
+ \DeclareUnicodeCharacter{016C}{\u{U}}
+ \DeclareUnicodeCharacter{016D}{\u{u}}
+ \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+ \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+ \DeclareUnicodeCharacter{0170}{\H{U}}
+ \DeclareUnicodeCharacter{0171}{\H{u}}
+ \DeclareUnicodeCharacter{0174}{\^W}
+ \DeclareUnicodeCharacter{0175}{\^w}
+ \DeclareUnicodeCharacter{0176}{\^Y}
+ \DeclareUnicodeCharacter{0177}{\^y}
+ \DeclareUnicodeCharacter{0178}{\"Y}
+ \DeclareUnicodeCharacter{0179}{\'Z}
+ \DeclareUnicodeCharacter{017A}{\'z}
+ \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+ \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+ \DeclareUnicodeCharacter{017D}{\v{Z}}
+ \DeclareUnicodeCharacter{017E}{\v{z}}
+
+ \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+ \DeclareUnicodeCharacter{01C5}{D\v{z}}
+ \DeclareUnicodeCharacter{01C6}{d\v{z}}
+ \DeclareUnicodeCharacter{01C7}{LJ}
+ \DeclareUnicodeCharacter{01C8}{Lj}
+ \DeclareUnicodeCharacter{01C9}{lj}
+ \DeclareUnicodeCharacter{01CA}{NJ}
+ \DeclareUnicodeCharacter{01CB}{Nj}
+ \DeclareUnicodeCharacter{01CC}{nj}
+ \DeclareUnicodeCharacter{01CD}{\v{A}}
+ \DeclareUnicodeCharacter{01CE}{\v{a}}
+ \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+ \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+ \DeclareUnicodeCharacter{01D1}{\v{O}}
+ \DeclareUnicodeCharacter{01D2}{\v{o}}
+ \DeclareUnicodeCharacter{01D3}{\v{U}}
+ \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+ \DeclareUnicodeCharacter{01E2}{\={\AE}}
+ \DeclareUnicodeCharacter{01E3}{\={\ae}}
+ \DeclareUnicodeCharacter{01E6}{\v{G}}
+ \DeclareUnicodeCharacter{01E7}{\v{g}}
+ \DeclareUnicodeCharacter{01E8}{\v{K}}
+ \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+ \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+ \DeclareUnicodeCharacter{01F1}{DZ}
+ \DeclareUnicodeCharacter{01F2}{Dz}
+ \DeclareUnicodeCharacter{01F3}{dz}
+ \DeclareUnicodeCharacter{01F4}{\'G}
+ \DeclareUnicodeCharacter{01F5}{\'g}
+ \DeclareUnicodeCharacter{01F8}{\`N}
+ \DeclareUnicodeCharacter{01F9}{\`n}
+ \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+ \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+ \DeclareUnicodeCharacter{01FE}{\'{\O}}
+ \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+ \DeclareUnicodeCharacter{021E}{\v{H}}
+ \DeclareUnicodeCharacter{021F}{\v{h}}
+
+ \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+ \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+ \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+ \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+ \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+ \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+ \DeclareUnicodeCharacter{0232}{\=Y}
+ \DeclareUnicodeCharacter{0233}{\=y}
+ \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+ \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+ \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+ \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+ \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+ \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+ \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+ \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+ \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+ \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+ \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+ \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+ \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+ \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+ \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+ \DeclareUnicodeCharacter{1E20}{\=G}
+ \DeclareUnicodeCharacter{1E21}{\=g}
+ \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+ \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+ \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+ \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+ \DeclareUnicodeCharacter{1E26}{\"H}
+ \DeclareUnicodeCharacter{1E27}{\"h}
+
+ \DeclareUnicodeCharacter{1E30}{\'K}
+ \DeclareUnicodeCharacter{1E31}{\'k}
+ \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+ \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+ \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+ \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+ \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+ \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+ \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+ \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+ \DeclareUnicodeCharacter{1E3E}{\'M}
+ \DeclareUnicodeCharacter{1E3F}{\'m}
+
+ \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+ \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+ \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+ \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+ \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+ \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+ \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+ \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+ \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+ \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+ \DeclareUnicodeCharacter{1E54}{\'P}
+ \DeclareUnicodeCharacter{1E55}{\'p}
+ \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+ \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+ \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+ \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+ \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+ \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+ \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+ \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+ \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+ \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+ \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+ \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+ \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+ \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+ \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+ \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+ \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+ \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+ \DeclareUnicodeCharacter{1E7C}{\~V}
+ \DeclareUnicodeCharacter{1E7D}{\~v}
+ \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+ \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+ \DeclareUnicodeCharacter{1E80}{\`W}
+ \DeclareUnicodeCharacter{1E81}{\`w}
+ \DeclareUnicodeCharacter{1E82}{\'W}
+ \DeclareUnicodeCharacter{1E83}{\'w}
+ \DeclareUnicodeCharacter{1E84}{\"W}
+ \DeclareUnicodeCharacter{1E85}{\"w}
+ \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+ \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+ \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+ \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+ \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+ \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+ \DeclareUnicodeCharacter{1E8C}{\"X}
+ \DeclareUnicodeCharacter{1E8D}{\"x}
+ \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+ \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+ \DeclareUnicodeCharacter{1E90}{\^Z}
+ \DeclareUnicodeCharacter{1E91}{\^z}
+ \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+ \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+ \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+ \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+ \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+ \DeclareUnicodeCharacter{1E97}{\"t}
+ \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+ \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+ \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+ \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+ \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+ \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+ \DeclareUnicodeCharacter{1EBC}{\~E}
+ \DeclareUnicodeCharacter{1EBD}{\~e}
+
+ \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+ \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+ \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+ \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+ \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+ \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+ \DeclareUnicodeCharacter{1EF2}{\`Y}
+ \DeclareUnicodeCharacter{1EF3}{\`y}
+ \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+ \DeclareUnicodeCharacter{1EF8}{\~Y}
+ \DeclareUnicodeCharacter{1EF9}{\~y}
+
+ \DeclareUnicodeCharacter{2013}{--}
+ \DeclareUnicodeCharacter{2014}{---}
+ \DeclareUnicodeCharacter{2022}{\bullet}
+ \DeclareUnicodeCharacter{2026}{\dots}
+ \DeclareUnicodeCharacter{20AC}{\euro}
+
+ \DeclareUnicodeCharacter{2192}{\expansion}
+ \DeclareUnicodeCharacter{21D2}{\result}
+
+ \DeclareUnicodeCharacter{2212}{\minus}
+ \DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+ \parskip = 1.5pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.4in}{4.8in}%
+ {-.2in}{-.4in}%
+ {0pt}{14pt}%
+ {9in}{6in}%
+ %
+ \lispnarrowing = 0.25in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+ \normalturnoffactive
+ \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+% @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+@def@normalturnoffactive{%
+ @let\=@normalbackslash
+ @let"=@normaldoublequote
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore
diff --git a/config.h.in b/config.h.in
index cbb50ca..394f82a 100644
--- a/config.h.in
+++ b/config.h.in
@@ -10,11 +10,14 @@
language is requested. */
#undef ENABLE_NLS
-/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+/* Define to use the GNU C visibility attribute. */
+#undef GPGRT_USE_VISIBILITY
+
+/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
CoreFoundation framework. */
#undef HAVE_CFLOCALECOPYCURRENT
-/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
@@ -32,27 +35,48 @@
/* Define to 1 if you have the `flockfile' function. */
#undef HAVE_FLOCKFILE
+/* Defined if a GCC style "__attribute__ ((aligned (n))" is supported */
+#undef HAVE_GCC_ATTRIBUTE_ALIGNED
+
/* Define if the GNU gettext() function is already present or preinstalled. */
#undef HAVE_GETTEXT
/* Define if you have the iconv() function and it works. */
#undef HAVE_ICONV
+/* Define to 1 if the system has the type `intmax_t'. */
+#undef HAVE_INTMAX_T
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
+/* Define if you have <langinfo.h> and nl_langinfo(THOUSANDS_SEP). */
+#undef HAVE_LANGINFO_THOUSANDS_SEP
+
/* Define to 1 if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
+/* Define to 1 if the system has the type `long double'. */
+#undef HAVE_LONG_DOUBLE
+
+/* Define to 1 if the system has the type 'long long int'. */
+#undef HAVE_LONG_LONG_INT
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
+/* Define to 1 if you have the `memrchr' function. */
+#undef HAVE_MEMRCHR
+
/* Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE. */
#undef HAVE_PTHREAD_MUTEX_RECURSIVE
/* Define if the POSIX multithreading library has read/write locks. */
#undef HAVE_PTHREAD_RWLOCK
+/* Define to 1 if the system has the type `ptrdiff_t'. */
+#undef HAVE_PTRDIFF_T
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@@ -68,15 +92,30 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
+/* Define to 1 if the system has the type `uintmax_t'. */
+#undef HAVE_UINTMAX_T
+
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* Define to 1 if the system has the type 'unsigned long long int'. */
+#undef HAVE_UNSIGNED_LONG_LONG_INT
+
+/* Define to 1 if you have the `vasprintf' function. */
+#undef HAVE_VASPRINTF
+
/* Defined if we run on WindowsCE */
#undef HAVE_W32CE_SYSTEM
@@ -93,9 +132,6 @@
*/
#undef LT_OBJDIR
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
/* Name of package */
#undef PACKAGE
@@ -120,15 +156,39 @@
/* Define if the pthread_in_use() detection is hard. */
#undef PTHREAD_IN_USE_DETECTION_HARD
+/* Used by mkheader to insert the replacement type. */
+#undef REPLACEMENT_FOR_OFF_T
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
/* The size of `pthread_mutex_t', as computed by sizeof. */
#undef SIZEOF_PTHREAD_MUTEX_T
+/* The size of `time_t', as computed by sizeof. */
+#undef SIZEOF_TIME_T
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `void *', as computed by sizeof. */
+#undef SIZEOF_VOID_P
+
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to 1 if strerror_r returns char *. */
#undef STRERROR_R_CHAR_P
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
/* Define if the POSIX multithreading library can be used. */
#undef USE_POSIX_THREADS
@@ -171,6 +231,17 @@
/* Version number of package */
#undef VERSION
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
/* Define to 1 if on MINIX. */
#undef _MINIX
@@ -184,13 +255,27 @@
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
+/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do
+ not define. */
+#undef intmax_t
+
+/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
+ do not define. */
+#undef uintmax_t
+
/* Force using of NLS for W32 even if no libintl has been found. This is
okay because we have our own gettext implementation for W32. */
#if defined(HAVE_W32_SYSTEM) && !defined(ENABLE_NLS)
#define ENABLE_NLS 1
#endif
+
+/* Connect the generic estream-printf.c to our framework. */
+#define _ESTREAM_PRINTF_REALLOC _gpgrt_realloc
+#define _ESTREAM_PRINTF_EXTRA_INCLUDE "gpgrt-int.h"
+
/* For building we need to define these macro. */
#define GPG_ERR_ENABLE_GETTEXT_MACROS 1
#define GPG_ERR_ENABLE_ERRNO_MACROS 1
+#define GPGRT_ENABLE_ES_MACROS 1
diff --git a/configure b/configure
index 09db8d2..ac8ba25 100755
--- a/configure
+++ b/configure
@@ -1,8 +1,8 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for libgpg-error 1.13.
+# Generated by GNU Autoconf 2.69 for libgpg-error 1.27.
#
-# Report bugs to <http://bugs.gnupg.org>.
+# Report bugs to <https://bugs.gnupg.org>.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -275,7 +275,7 @@ fi
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: http://bugs.gnupg.org about your system, including any
+$0: https://bugs.gnupg.org about your system, including any
$0: error possibly output before this message. Then install
$0: a modern shell, or manually run the script under such a
$0: shell if you do have one."
@@ -590,9 +590,9 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='libgpg-error'
PACKAGE_TARNAME='libgpg-error'
-PACKAGE_VERSION='1.13'
-PACKAGE_STRING='libgpg-error 1.13'
-PACKAGE_BUGREPORT='http://bugs.gnupg.org'
+PACKAGE_VERSION='1.27'
+PACKAGE_STRING='libgpg-error 1.27'
+PACKAGE_BUGREPORT='https://bugs.gnupg.org'
PACKAGE_URL=''
ac_unique_file="src/err-sources.h.in"
@@ -638,11 +638,18 @@ ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
+BUILD_TESTS_FALSE
+BUILD_TESTS_TRUE
+BUILD_DOC_FALSE
+BUILD_DOC_TRUE
LANGUAGES_SOME_FALSE
LANGUAGES_SOME_TRUE
BUILD_TIMESTAMP
BUILD_FILEVERSION
+BUILD_VERSION
BUILD_REVISION
+FORCE_USE_SYSCFG_FALSE
+FORCE_USE_SYSCFG_TRUE
CROSS_COMPILING_FALSE
CROSS_COMPILING_TRUE
HAVE_W32CE_SYSTEM_FALSE
@@ -657,10 +664,13 @@ GPG_ERROR_CONFIG_MT_CFLAGS
GPG_ERROR_CONFIG_MT_LIBS
GPG_ERROR_CONFIG_CFLAGS
GPG_ERROR_CONFIG_LIBS
+LIB_SCHED_YIELD
LTLIBMULTITHREAD
LIBMULTITHREAD
LTLIBTHREAD
LIBTHREAD
+HAVE_LD_VERSION_SCRIPT_FALSE
+HAVE_LD_VERSION_SCRIPT_TRUE
POSUB
LTLIBINTL
LIBINTL
@@ -728,13 +738,13 @@ build_os
build_vendor
build_cpu
build
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
AM_V
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
am__untar
am__tar
AMTAR
@@ -803,10 +813,11 @@ SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
-enable_maintainer_mode
enable_silent_rules
+enable_maintainer_mode
enable_dependency_tracking
enable_threads
+enable_largefile
enable_static
enable_shared
with_pic
@@ -818,7 +829,11 @@ enable_nls
enable_rpath
with_libiconv_prefix
with_libintl_prefix
+enable_ld_version_script
+enable_build_timestamp
enable_languages
+enable_doc
+enable_tests
'
ac_precious_vars='build_alias
host_alias
@@ -1370,7 +1385,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures libgpg-error 1.13 to adapt to many kinds of systems.
+\`configure' configures libgpg-error 1.27 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1440,7 +1455,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of libgpg-error 1.13:";;
+ short | recursive ) echo "Configuration of libgpg-error 1.27:";;
esac
cat <<\_ACEOF
@@ -1448,15 +1463,19 @@ Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-maintainer-mode enable make rules and dependencies not useful
- (and sometimes confusing) to the casual installer
- --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')
- --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
--enable-threads={posix|solaris|windows}
specify multithreading API
--disable-threads build without multithread safety
+ --disable-largefile omit support for large files
--enable-static[=PKGS] build static libraries [default=no]
--enable-shared[=PKGS] build shared libraries [default=yes]
--enable-fast-install[=PKGS]
@@ -1464,7 +1483,15 @@ Optional Features:
--disable-libtool-lock avoid locking (might break parallel builds)
--disable-nls do not use Native Language Support
--disable-rpath do not hardcode runtime library paths
+ --enable-ld-version-script
+ enable/disable use of linker version script.
+ (default is system dependent)
+ --enable-build-timestamp
+ set an explicit build timestamp for reproducibility.
+ (default is the current time in ISO-8601 format)
--disable-languages do not build support for other languages than C
+ --disable-doc do not build the documentation
+ --disable-tests do not build the tests
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1474,7 +1501,7 @@ Optional Packages:
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-sysroot=DIR Search for dependent libraries within DIR
(or the compiler's sysroot if not specified).
- --with-gnu-ld assume the C compiler uses GNU ld default=no
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
--with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
--without-libiconv-prefix don't search for libiconv in includedir and libdir
--with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib
@@ -1495,7 +1522,7 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
-Report bugs to <http://bugs.gnupg.org>.
+Report bugs to <https://bugs.gnupg.org>.
_ACEOF
ac_status=$?
fi
@@ -1558,7 +1585,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-libgpg-error configure 1.13
+libgpg-error configure 1.27
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1717,9 +1744,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------ ##
-## Report this to http://bugs.gnupg.org ##
-## ------------------------------------ ##"
+( $as_echo "## ------------------------------------- ##
+## Report this to https://bugs.gnupg.org ##
+## ------------------------------------- ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
@@ -1970,60 +1997,6 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_decl
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=no"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-if (sizeof ($2))
- return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
- return 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_type
-
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -2206,11 +2179,65 @@ rm -f conftest.val
as_fn_set_status $ac_retval
} # ac_fn_c_compute_int
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by libgpg-error $as_me 1.13, which was
+It was created by libgpg-error $as_me 1.27, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2565,8 +2592,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
# (Interfaces added: AGE++)
# (Interfaces removed: AGE=0)
# Note that added error codes don't constitute an interface change.
-LIBGPG_ERROR_LT_CURRENT=11
-LIBGPG_ERROR_LT_AGE=11
+LIBGPG_ERROR_LT_CURRENT=22
+LIBGPG_ERROR_LT_AGE=22
LIBGPG_ERROR_LT_REVISION=0
################################################
@@ -2574,7 +2601,7 @@ LIBGPG_ERROR_LT_REVISION=0
-VERSION_NUMBER=0x010d00
+VERSION_NUMBER=0x011b00
ac_aux_dir=
@@ -2606,7 +2633,7 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-am__api_version='1.11'
+am__api_version='1.14'
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
@@ -2703,9 +2730,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -2716,32 +2740,40 @@ case `pwd` in
esac
case $srcdir in
*[\\\"\#\$\&\'\`$am_lf\ \ ]*)
- as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
esac
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
-alias in your environment" "$LINENO" 5
- fi
-
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
test "$2" = conftest.file
)
then
@@ -2753,6 +2785,16 @@ Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
test "$program_prefix" != NONE &&
program_transform_name="s&^&$program_prefix&;$program_transform_name"
# Use a double $ so make ignores it.
@@ -2763,8 +2805,8 @@ test "$program_suffix" != NONE &&
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
@@ -2775,12 +2817,12 @@ if test x"${MISSING+set}" != xset; then
esac
fi
# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
else
am_missing_run=
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
fi
if test x"${install_sh}" != xset; then
@@ -2792,10 +2834,10 @@ if test x"${install_sh}" != xset; then
esac
fi
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
+# will honor the 'STRIP' environment variable to overrule this program.
if test "$cross_compiling" != no; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -2934,12 +2976,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
$as_echo "$MKDIR_P" >&6; }
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
- [\\/$]* | ?:[\\/]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
for ac_prog in gawk mawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -3022,6 +3058,45 @@ else
fi
rmdir .tst 2>/dev/null
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
if test "`cd $srcdir && pwd`" != "`pwd`"; then
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
# is not polluted with repeated "-I."
@@ -3044,7 +3119,7 @@ fi
# Define the identity of the package.
PACKAGE='libgpg-error'
- VERSION='1.13'
+ VERSION='1.27'
cat >>confdefs.h <<_ACEOF
@@ -3072,12 +3147,22 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
# Always define AMTAR for backward compatibility. Yes, it's still used
# in the wild :-( We should find a proper way to deprecate it ...
AMTAR='$${TAR-tar}'
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
@@ -3085,6 +3170,49 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
# Check whether --enable-maintainer-mode was given.
@@ -3116,10 +3244,10 @@ if test "${enable_silent_rules+set}" = set; then :
enableval=$enable_silent_rules;
fi
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=1;;
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
esac
am_make=${MAKE-make}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
@@ -4037,6 +4165,65 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
DEPDIR="${am__leading_dot}deps"
ac_config_commands="$ac_config_commands depfiles"
@@ -4056,7 +4243,7 @@ am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
case `$am_make -s -f confmf 2> /dev/null` in #(
*the\ am__doit\ target*)
am__include=include
@@ -4112,8 +4299,8 @@ else
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
@@ -4148,16 +4335,16 @@ else
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
am__obj=sub/conftest.${OBJEXT-o}
am__minus_obj="-o $am__obj"
case $depmode in
@@ -4166,8 +4353,8 @@ else
test "$am__universal" = false || continue
;;
nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
if test "x$enable_dependency_tracking" = xyes; then
continue
else
@@ -4175,7 +4362,7 @@ else
fi
;;
msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
+ # This compiler won't grok '-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
am__obj=conftest.${OBJEXT-o}
@@ -4229,131 +4416,6 @@ else
fi
-if test "x$CC" != xcc; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
-fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
- sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } &&
- test -f conftest2.$ac_objext && { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; };
-then
- eval ac_cv_prog_cc_${ac_cc}_c_o=yes
- if test "x$CC" != xcc; then
- # Test first that cc exists at all.
- if { ac_try='cc -c conftest.$ac_ext >&5'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
- rm -f conftest2.*
- if { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } &&
- test -f conftest2.$ac_objext && { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; };
- then
- # cc works too.
- :
- else
- # cc exists but doesn't like -o.
- eval ac_cv_prog_cc_${ac_cc}_c_o=no
- fi
- fi
- fi
-else
- eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f core conftest*
-
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
-
-fi
-
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
@@ -5033,6 +5095,211 @@ fi
fi
+# We build libgpg-error with large file support so that we have a 64
+# bit off_t. Our external interface uses the gpgrt_off_t which is
+# anyway specified as 64 bit. Thus the same libgpg-error can be used
+# by software which is not build with large file support.
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_sys_largefile_CC=no
+ if test "$GCC" != yes; then
+ ac_save_CC=$CC
+ while :; do
+ # IRIX 6.2 and later do not support large files by default,
+ # so use the C compiler's -n32 option if that helps.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ CC="$CC -n32"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_OFF_T to be 9223372036854775807,
+ since some C++ compilers masquerading as C compilers
+ incorrectly reject 9223372036854775807. */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+ && LARGE_OFF_T % 2147483647 == 1)
+ ? 1 : -1];
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+ fi
+
+
+fi
+
+
case `pwd` in
@@ -12694,7 +12961,7 @@ $as_echo "$USE_NLS" >&6; }
- GETTEXT_MACRO_VERSION=0.17
+ GETTEXT_MACRO_VERSION=0.19
@@ -12702,15 +12969,14 @@ $as_echo "$USE_NLS" >&6; }
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
# Find out how to test for executable files. Don't use a zero-byte file,
@@ -12825,15 +13091,14 @@ fi
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
# Find out how to test for executable files. Don't use a zero-byte file,
@@ -12903,15 +13168,14 @@ fi
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
# Find out how to test for executable files. Don't use a zero-byte file,
@@ -12995,6 +13259,7 @@ fi
prefix="$acl_save_prefix"
+
# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
@@ -13005,21 +13270,21 @@ fi
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
+
ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5
-$as_echo_n "checking for ld used by GCC... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
@@ -13029,12 +13294,12 @@ $as_echo_n "checking for ld used by GCC... " >&6; }
esac
case $ac_prog in
# Accept absolute paths.
- [\\/]* | [A-Za-z]:[\\/]*)
+ [\\/]* | ?:[\\/]*)
re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
done
test -z "$LD" && LD="$ac_prog"
;;
@@ -13058,23 +13323,26 @@ if ${acl_cv_path_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
acl_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
+ # but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break ;;
+ test "$with_gnu_ld" != no && break
+ ;;
*)
- test "$with_gnu_ld" != yes && break ;;
+ test "$with_gnu_ld" != yes && break
+ ;;
esac
fi
done
- IFS="$ac_save_ifs"
+ IFS="$acl_save_ifs"
else
acl_cv_path_LD="$LD" # Let the user override the test with a path.
fi
@@ -13094,12 +13362,14 @@ $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${acl_cv_prog_gnu_ld+:} false; then :
$as_echo_n "(cached) " >&6
else
- # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- acl_cv_prog_gnu_ld=yes ;;
+ acl_cv_prog_gnu_ld=yes
+ ;;
*)
- acl_cv_prog_gnu_ld=no ;;
+ acl_cv_prog_gnu_ld=no
+ ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
@@ -13142,23 +13412,70 @@ fi
- acl_libdirstem=lib
- searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
- if test -n "$searchpath"; then
- acl_save_IFS="${IFS= }"; IFS=":"
- for searchdir in $searchpath; do
- if test -d "$searchdir"; then
- case "$searchdir" in
- */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
- *) searchdir=`cd "$searchdir" && pwd`
- case "$searchdir" in
- */lib64 ) acl_libdirstem=lib64 ;;
- esac ;;
+
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+ gl_cv_solaris_64bit=yes
+else
+ gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
esac
fi
- done
- IFS="$acl_save_IFS"
- fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
@@ -13204,6 +13521,10 @@ if test "${with_libiconv_prefix+set}" = set; then :
else
additional_includedir="$withval/include"
additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
fi
fi
@@ -13213,6 +13534,7 @@ fi
LTLIBICONV=
INCICONV=
LIBICONV_PREFIX=
+ HAVE_LIBICONV=
rpathdirs=
ltrpathdirs=
names_already_handled=
@@ -13230,7 +13552,7 @@ fi
done
if test -z "$already_handled"; then
names_already_handled="$names_already_handled $name"
- uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
eval value=\"\$HAVE_LIB$uppername\"
if test -n "$value"; then
if test "$value" = yes; then
@@ -13355,7 +13677,9 @@ fi
if test "X$found_dir" != "X"; then
LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
if test "X$found_so" != "X"; then
- if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
else
haveit=
@@ -13422,7 +13746,16 @@ fi
case "$found_dir" in
*/$acl_libdirstem | */$acl_libdirstem/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
- LIBICONV_PREFIX="$basedir"
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
additional_includedir="$basedir/include"
;;
esac
@@ -13471,9 +13804,11 @@ fi
case "$dep" in
-L*)
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
- if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
haveit=
- if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
if test -n "$GCC"; then
case $host_os in
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -13623,6 +13958,12 @@ fi
+
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
@@ -13740,15 +14081,19 @@ if eval \${$gt_func_gnugettext_libc+:} false; then :
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern int *_nl_domain_bindings;
+
int
main ()
{
+
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+
;
return 0;
}
@@ -13806,14 +14151,16 @@ else
am_cv_lib_iconv=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
#include <stdlib.h>
#include <iconv.h>
+
int
main ()
{
iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
;
return 0;
}
@@ -13828,14 +14175,16 @@ rm -f core conftest.err conftest.$ac_objext \
LIBS="$LIBS $LIBICONV"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
#include <stdlib.h>
#include <iconv.h>
+
int
main ()
{
iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
;
return 0;
}
@@ -13859,15 +14208,17 @@ if ${am_cv_func_iconv_works+:} false; then :
$as_echo_n "(cached) " >&6
else
- am_save_LIBS="$LIBS"
+ am_save_LIBS="$LIBS"
if test $am_cv_lib_iconv = yes; then
LIBS="$LIBS $LIBICONV"
fi
if test "$cross_compiling" = yes; then :
- case "$host_os" in
+
+ case "$host_os" in
aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
*) am_cv_func_iconv_works="guessing yes" ;;
esac
+
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -13876,6 +14227,7 @@ else
#include <string.h>
int main ()
{
+ int result = 0;
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful
returns. */
{
@@ -13892,7 +14244,47 @@ int main ()
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
- return 1;
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static const char input[] = "\263";
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static const char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ const char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
}
}
#if 0 /* This bug could be worked around by the caller. */
@@ -13911,7 +14303,8 @@ int main ()
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if ((int)res > 0)
- return 1;
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
}
}
#endif
@@ -13925,8 +14318,8 @@ int main ()
&& iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
/* Try HP-UX names. */
&& iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
- return 1;
- return 0;
+ result |= 16;
+ return result;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
@@ -13973,6 +14366,9 @@ $as_echo "$LIBICONV" >&6; }
+
+
+
use_additional=yes
acl_save_prefix="$prefix"
@@ -14009,6 +14405,10 @@ if test "${with_libintl_prefix+set}" = set; then :
else
additional_includedir="$withval/include"
additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
fi
fi
@@ -14018,6 +14418,7 @@ fi
LTLIBINTL=
INCINTL=
LIBINTL_PREFIX=
+ HAVE_LIBINTL=
rpathdirs=
ltrpathdirs=
names_already_handled=
@@ -14035,7 +14436,7 @@ fi
done
if test -z "$already_handled"; then
names_already_handled="$names_already_handled $name"
- uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
eval value=\"\$HAVE_LIB$uppername\"
if test -n "$value"; then
if test "$value" = yes; then
@@ -14160,7 +14561,9 @@ fi
if test "X$found_dir" != "X"; then
LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
if test "X$found_so" != "X"; then
- if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
else
haveit=
@@ -14227,7 +14630,16 @@ fi
case "$found_dir" in
*/$acl_libdirstem | */$acl_libdirstem/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
- LIBINTL_PREFIX="$basedir"
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
additional_includedir="$basedir/include"
;;
esac
@@ -14276,9 +14688,11 @@ fi
case "$dep" in
-L*)
additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
- if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
haveit=
- if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
if test -n "$GCC"; then
case $host_os in
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -14404,6 +14818,11 @@ fi
done
fi
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
$as_echo_n "checking for GNU gettext in libintl... " >&6; }
if eval \${$gt_func_gnugettext_libintl+:} false; then :
@@ -14415,6 +14834,7 @@ else
LIBS="$LIBS $LIBINTL"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
@@ -14423,11 +14843,14 @@ extern
"C"
#endif
const char *_nl_expand_alias (const char *);
+
int
main ()
{
+
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
;
return 0;
}
@@ -14443,6 +14866,7 @@ rm -f core conftest.err conftest.$ac_objext \
LIBS="$LIBS $LIBICONV"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
@@ -14451,19 +14875,22 @@ extern
"C"
#endif
const char *_nl_expand_alias (const char *);
+
int
main ()
{
+
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
LIBINTL="$LIBINTL $LIBICONV"
- LTLIBINTL="$LTLIBINTL $LTLIBICONV"
- eval "$gt_func_gnugettext_libintl=yes"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
fi
rm -f core conftest.err conftest.$ac_objext \
@@ -14695,7 +15122,7 @@ $as_echo "#define STDC_HEADERS 1" >>confdefs.h
fi
-for ac_header in stdlib.h locale.h
+for ac_header in stdlib.h locale.h stdint.h sys/select.h sys/time.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
@@ -14817,12 +15244,13 @@ fi
;;
esac
-for ac_func in flockfile
+for ac_func in flockfile vasprintf
do :
- ac_fn_c_check_func "$LINENO" "flockfile" "ac_cv_func_flockfile"
-if test "x$ac_cv_func_flockfile" = xyes; then :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
-#define HAVE_FLOCKFILE 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
@@ -14830,7 +15258,9 @@ done
+#
# Checks for typedefs, structures, and compiler characteristics.
+#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
if ${ac_cv_c_const+:} false; then :
@@ -14913,7 +15343,534 @@ $as_echo "#define const /**/" >>confdefs.h
fi
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_int" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_int=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_long_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_long_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_time=yes
+else
+ ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
+$as_echo_n "checking size of time_t... " >&6; }
+if ${ac_cv_sizeof_time_t+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "
+#include <stdio.h>
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+"; then :
+
+else
+ if test "$ac_cv_type_time_t" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (time_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_time_t=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
+$as_echo "$ac_cv_sizeof_time_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_TIME_T $ac_cv_sizeof_time_t
+_ACEOF
+
+
+
+# Find a 64 bit integer type to be used instead of off_t. We prefer
+# the standard integer types over int64_t and finally try long long.
+if test "$ac_cv_sizeof_int" = "8"; then
+ replacement_for_off_t="int"
+elif test "$ac_cv_sizeof_long" = "8"; then
+ replacement_for_off_t="long"
+elif test "$ac_cv_header_stdint_h" = yes; then
+ replacement_for_off_t="int64_t"
+elif test "$ac_cv_sizeof_long_long" = "8"; then
+ replacement_for_off_t="long long"
+else
+ as_fn_error $? "
+***
+*** No 64 bit signed integer type found. Can't build this library.
+***" "$LINENO" 5
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define REPLACEMENT_FOR_OFF_T "$replacement_for_off_t"
+_ACEOF
+
+
+
+#
+# Setup gcc specific options
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cc features" >&5
+$as_echo "$as_me: checking for cc features" >&6;}
+if test "$GCC" = yes; then
+ # Check whether gcc does not emit a diagnostic for unknown -Wno-*
+ # options. This is the case for gcc >= 4.6
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc ignores unknown -Wno-* options" >&5
+$as_echo_n "checking if gcc ignores unknown -Wno-* options... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6 )
+#kickerror
+#endif
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ _gcc_silent_wno=yes
+else
+ _gcc_silent_wno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_gcc_silent_wno" >&5
+$as_echo "$_gcc_silent_wno" >&6; }
+
+ # Note that it is okay to use CFLAGS here because these are just
+ # warning options and the user should have a chance of overriding
+ # them.
+ if test "$USE_MAINTAINER_MODE" = "yes"; then
+ CFLAGS="$CFLAGS -O3 -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
+ CFLAGS="$CFLAGS -Wformat -Wno-format-y2k -Wformat-security"
+ if test x"$_gcc_silent_wno" = xyes ; then
+ _gcc_wopt=yes
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc supports -Wno-missing-field-initializers" >&5
+$as_echo_n "checking if gcc supports -Wno-missing-field-initializers... " >&6; }
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wno-missing-field-initializers"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ _gcc_wopt=yes
+else
+ _gcc_wopt=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_gcc_wopt" >&5
+$as_echo "$_gcc_wopt" >&6; }
+ CFLAGS=$_gcc_cflags_save;
+ fi
+ if test x"$_gcc_wopt" = xyes ; then
+ CFLAGS="$CFLAGS -W -Wno-sign-compare -Wno-missing-field-initializers"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc supports -Wdeclaration-after-statement" >&5
+$as_echo_n "checking if gcc supports -Wdeclaration-after-statement... " >&6; }
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wdeclaration-after-statement"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ _gcc_wopt=yes
+else
+ _gcc_wopt=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_gcc_wopt" >&5
+$as_echo "$_gcc_wopt" >&6; }
+ CFLAGS=$_gcc_cflags_save;
+ if test x"$_gcc_wopt" = xyes ; then
+ CFLAGS="$CFLAGS -Wdeclaration-after-statement"
+ fi
+ else
+ CFLAGS="$CFLAGS -Wall"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc supports -Wpointer-arith" >&5
+$as_echo_n "checking if gcc supports -Wpointer-arith... " >&6; }
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wpointer-arith"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ _gcc_psign=yes
+else
+ _gcc_psign=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_gcc_psign" >&5
+$as_echo "$_gcc_psign" >&6; }
+ CFLAGS=$_gcc_cflags_save;
+ if test x"$_gcc_psign" = xyes ; then
+ CFLAGS="$CFLAGS -Wpointer-arith"
+ fi
+
+ # The undocumented option -Wno-psabi suppresses the annoying
+ # "the ABI of passing union with long double has changed in GCC 4.4"
+ # which is emitted in estream-printf.c but entirely irrelvant
+ # because that union is local to the file.
+ if test x"$_gcc_silent_wno" = xyes ; then
+ CFLAGS="$CFLAGS -Wno-psabi"
+ fi
+fi
+
+#
+# Check whether the compiler supports the GCC style aligned attribute
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the GCC style aligned attribute is supported" >&5
+$as_echo_n "checking whether the GCC style aligned attribute is supported... " >&6; }
+if ${gcry_cv_gcc_attribute_aligned+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gcry_cv_gcc_attribute_aligned=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+struct { int a; } foo __attribute__ ((aligned (16)));
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ gcry_cv_gcc_attribute_aligned=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcry_cv_gcc_attribute_aligned" >&5
+$as_echo "$gcry_cv_gcc_attribute_aligned" >&6; }
+if test "$gcry_cv_gcc_attribute_aligned" = "yes" ; then
+
+$as_echo "#define HAVE_GCC_ATTRIBUTE_ALIGNED 1" >>confdefs.h
+
+fi
+
+#
+# Check for ELF visibility support.
+#
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the visibility attribute is supported" >&5
+$as_echo_n "checking whether the visibility attribute is supported... " >&6; }
+if ${gcry_cv_visibility_attribute+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gcry_cv_visibility_attribute=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo __attribute__ ((visibility ("hidden"))) = 1;
+ int bar __attribute__ ((visibility ("protected"))) = 1;
+
+_ACEOF
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&5 2>&5 ; then
+ if grep '\.hidden.*foo' conftest.s >/dev/null 2>&1 ; then
+ if grep '\.protected.*bar' conftest.s >/dev/null 2>&1; then
+ gcry_cv_visibility_attribute=yes
+ fi
+ fi
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcry_cv_visibility_attribute" >&5
+$as_echo "$gcry_cv_visibility_attribute" >&6; }
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken visibility attribute" >&5
+$as_echo_n "checking for broken visibility attribute... " >&6; }
+if ${gcry_cv_broken_visibility_attribute+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gcry_cv_broken_visibility_attribute=yes
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int foo (int x);
+ int bar (int x) __asm__ ("foo")
+ __attribute__ ((visibility ("hidden")));
+ int bar (int x) { return x; }
+
+_ACEOF
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&5 2>&5 ; then
+ if grep '\.hidden[ _]foo' conftest.s >/dev/null 2>&1;
+ then
+ gcry_cv_broken_visibility_attribute=no
+ fi
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcry_cv_broken_visibility_attribute" >&5
+$as_echo "$gcry_cv_broken_visibility_attribute" >&6; }
+fi
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken alias attribute" >&5
+$as_echo_n "checking for broken alias attribute... " >&6; }
+if ${gcry_cv_broken_alias_attribute+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gcry_cv_broken_alias_attribute=yes
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern int foo (int x) __asm ("xyzzy");
+ int bar (int x) { return x; }
+ extern __typeof (bar) foo __attribute ((weak, alias ("bar")));
+ extern int dfoo;
+ extern __typeof (dfoo) dfoo __asm ("abccb");
+ int dfoo = 1;
+
+_ACEOF
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&5 2>&5 ; then
+ if grep 'xyzzy' conftest.s >/dev/null 2>&1 && \
+ grep 'abccb' conftest.s >/dev/null 2>&1; then
+ gcry_cv_broken_alias_attribute=no
+ fi
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcry_cv_broken_alias_attribute" >&5
+$as_echo "$gcry_cv_broken_alias_attribute" >&6; }
+fi
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if gcc supports -fvisibility=hidden" >&5
+$as_echo_n "checking if gcc supports -fvisibility=hidden... " >&6; }
+if ${gcry_cv_gcc_has_f_visibility+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ gcry_cv_gcc_has_f_visibility=no
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-fvisibility=hidden"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ gcry_cv_gcc_has_f_visibility=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$_gcc_cflags_save;
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcry_cv_gcc_has_f_visibility" >&5
+$as_echo "$gcry_cv_gcc_has_f_visibility" >&6; }
+fi
+if test "$gcry_cv_visibility_attribute" = "yes" \
+ && test "$gcry_cv_broken_visibility_attribute" != "yes" \
+ && test "$gcry_cv_broken_alias_attribute" != "yes" \
+ && test "$gcry_cv_gcc_has_f_visibility" = "yes"
+ then
+
+$as_echo "#define GPGRT_USE_VISIBILITY 1" >>confdefs.h
+
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+fi
+
+#
+# Check whether ld supports a version script.
+# (Actually not a check but a list of systems which are known to support it.)
+#
+have_ld_version_script=no
+case "${host}" in
+ *-*-linux*)
+ have_ld_version_script=yes
+ ;;
+ *-*-gnu*)
+ have_ld_version_script=yes
+ ;;
+esac
+# Check whether --enable-ld-version-script was given.
+if test "${enable_ld_version_script+set}" = set; then :
+ enableval=$enable_ld_version_script; have_ld_version_script=$enableval
+else
+ :
+fi
+
+ if test "$have_ld_version_script" = "yes"; then
+ HAVE_LD_VERSION_SCRIPT_TRUE=
+ HAVE_LD_VERSION_SCRIPT_FALSE='#'
+else
+ HAVE_LD_VERSION_SCRIPT_TRUE='#'
+ HAVE_LD_VERSION_SCRIPT_FALSE=
+fi
+
+
+
+#
# Check for thread library.
#
# Windows has always thread support; thus we don't bother to test for
@@ -15362,9 +16319,419 @@ _ACEOF
fi
fi
+# Default value for GPG_ERROR_CONFIG_LIBS
+config_libs="-lgpg-error"
+
+#
+# Check for other libraries (now only for -lrt).
+#
+LIB_SCHED_YIELD=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5
+$as_echo_n "checking for library containing sched_yield... " >&6; }
+if ${ac_cv_search_sched_yield+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sched_yield ();
+int
+main ()
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' rt posix4; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_sched_yield=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_sched_yield+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_sched_yield+:} false; then :
+
+else
+ ac_cv_search_sched_yield=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5
+$as_echo "$ac_cv_search_sched_yield" >&6; }
+ac_res=$ac_cv_search_sched_yield
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_sched_yield" != "none required"; then
+ LIB_SCHED_YIELD=$ac_cv_search_sched_yield
+ config_libs="$config_libs $LIB_SCHED_YIELD"
+ fi
+fi
+
+
+#
+# Prepare building of estream
+#
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
+$as_echo_n "checking for unsigned long long int... " >&6; }
+if ${ac_cv_type_unsigned_long_long_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_type_unsigned_long_long_int=yes
+ if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ /* For now, do not test the preprocessor; as of 2007 there are too many
+ implementations with broken preprocessors. Perhaps this can
+ be revisited in 2012. In the meantime, code should not expect
+ #if to work with literals wider than 32 bits. */
+ /* Test literals. */
+ long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ unsigned long long int ull = 18446744073709551615ULL;
+ /* Test constant expressions. */
+ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;
+int
+main ()
+{
+/* Test availability of runtime routines for shift and division. */
+ long long int llmax = 9223372036854775807ll;
+ unsigned long long int ullmax = 18446744073709551615ull;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll)
+ | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+ | (ullmax / ull) | (ullmax % ull));
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+ ac_cv_type_unsigned_long_long_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
+$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking system features for estream-printf" >&5
+$as_echo "$as_me: checking system features for estream-printf" >&6;}
+ for ac_header in stdint.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
+$as_echo_n "checking for long long int... " >&6; }
+if ${ac_cv_type_long_long_int+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_type_long_long_int=yes
+ if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+ ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+ if test $ac_cv_type_long_long_int = yes; then
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ #ifndef LLONG_MAX
+ # define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ # define LLONG_MAX (HALF - 1 + HALF)
+ #endif
+int
+main ()
+{
+long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_type_long_long_int=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5
+$as_echo "$ac_cv_type_long_long_int" >&6; }
+ if test $ac_cv_type_long_long_int = yes; then
+
+$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
+
+ fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5
+$as_echo_n "checking for long double... " >&6; }
+if ${ac_cv_type_long_double+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$GCC" = yes; then
+ ac_cv_type_long_double=yes
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* The Stardent Vistra knows sizeof (long double), but does
+ not support it. */
+ long double foo = 0.0L;
+int
+main ()
+{
+static int test_array [1 - 2 * !(/* On Ultrix 4.3 cc, long double is 4 and double is 8. */
+ sizeof (double) <= sizeof (long double))];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_type_long_double=yes
+else
+ ac_cv_type_long_double=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_double" >&5
+$as_echo "$ac_cv_type_long_double" >&6; }
+ if test $ac_cv_type_long_double = yes; then
+
+$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h
+
+ fi
+
+
+
+ ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default"
+if test "x$ac_cv_type_intmax_t" = xyes; then :
+
+$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h
+
+else
+ test $ac_cv_type_long_long_int = yes \
+ && ac_type='long long int' \
+ || ac_type='long int'
+
+cat >>confdefs.h <<_ACEOF
+#define intmax_t $ac_type
+_ACEOF
+
+fi
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintmax_t" = xyes; then :
+$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h
+
+else
+ test $ac_cv_type_unsigned_long_long_int = yes \
+ && ac_type='unsigned long long int' \
+ || ac_type='unsigned long int'
+
+cat >>confdefs.h <<_ACEOF
+#define uintmax_t $ac_type
+_ACEOF
+
+fi
+
+
+ ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_PTRDIFF_T 1
+_ACEOF
+
+
+fi
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_unsigned_long=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+ # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+$as_echo_n "checking size of void *... " >&6; }
+if ${ac_cv_sizeof_void_p+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
+
+else
+ if test "$ac_cv_type_void_p" = yes; then
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (void *)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_void_p=0
+ fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+$as_echo "$ac_cv_sizeof_void_p" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
+_ACEOF
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and THOUSANDS_SEP" >&5
+$as_echo_n "checking for nl_langinfo and THOUSANDS_SEP... " >&6; }
+if ${estream_cv_langinfo_thousands_sep+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(THOUSANDS_SEP); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ estream_cv_langinfo_thousands_sep=yes
+else
+ estream_cv_langinfo_thousands_sep=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $estream_cv_langinfo_thousands_sep" >&5
+$as_echo "$estream_cv_langinfo_thousands_sep" >&6; }
+ if test $estream_cv_langinfo_thousands_sep = yes; then
+
+$as_echo "#define HAVE_LANGINFO_THOUSANDS_SEP 1" >>confdefs.h
+
+ fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking system features for estream" >&5
+$as_echo "$as_me: checking system features for estream" >&6;}
+ for ac_func in memrchr
+do :
+ ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
+if test "x$ac_cv_func_memrchr" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_MEMRCHR 1
+_ACEOF
+
+fi
+done
+
+
+
+#
# Substitution used for gpg-error-config
-GPG_ERROR_CONFIG_LIBS="-lgpg-error"
+#
+GPG_ERROR_CONFIG_LIBS="$config_libs"
if test "x$LIBTHREAD" != x; then
GPG_ERROR_CONFIG_LIBS="${GPG_ERROR_CONFIG_LIBS} ${LIBTHREAD}"
fi
@@ -15389,7 +16756,10 @@ GPG_ERROR_CONFIG_HOST="$host"
+#
# Special defines for certain platforms
+#
+force_use_syscfg=no
if test "$have_w32_system" = yes; then
$as_echo "#define HAVE_W32_SYSTEM 1" >>confdefs.h
@@ -15405,7 +16775,12 @@ $as_echo "#define HAVE_W32CE_SYSTEM 1" >>confdefs.h
GPG_ERROR_CONFIG_ISUBDIRAFTER="gpg-extra"
fi
+ force_use_syscfg=yes
fi
+if test x$cross_compiling = xyes; then
+ force_use_syscfg=yes
+fi
+
if test "$have_w32_system" = yes; then
HAVE_W32_SYSTEM_TRUE=
HAVE_W32_SYSTEM_FALSE='#'
@@ -15438,6 +16813,14 @@ else
CROSS_COMPILING_FALSE=
fi
+ if test x$force_use_syscfg = xyes; then
+ FORCE_USE_SYSCFG_TRUE=
+ FORCE_USE_SYSCFG_FALSE='#'
+else
+ FORCE_USE_SYSCFG_TRUE='#'
+ FORCE_USE_SYSCFG_FALSE=
+fi
+
cat >>confdefs.h <<_ACEOF
@@ -15449,7 +16832,7 @@ _ACEOF
#
# Provide information about the build.
#
-BUILD_REVISION="1900266"
+BUILD_REVISION="c1668f6"
cat >>confdefs.h <<_ACEOF
@@ -15457,11 +16840,23 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
-BUILD_FILEVERSION=`echo "$PACKAGE_VERSION"|sed 's/\([0-9.]*\).*/\1./;s/\./,/g'`
-BUILD_FILEVERSION="${BUILD_FILEVERSION}0,6400"
+BUILD_VERSION=`echo "$PACKAGE_VERSION"|sed 's/\([0-9.]*\).*/\1./'`
+BUILD_VERSION="${BUILD_VERSION}0.49510"
+BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
+
-BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+# Check whether --enable-build-timestamp was given.
+if test "${enable_build_timestamp+set}" = set; then :
+ enableval=$enable_build_timestamp; if test "$enableval" = "yes"; then
+ BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+ else
+ BUILD_TIMESTAMP="$enableval"
+ fi
+else
+ BUILD_TIMESTAMP="<none>"
+fi
+
cat >>confdefs.h <<_ACEOF
@@ -15485,17 +16880,52 @@ else
fi
+build_doc=yes
+# Check whether --enable-doc was given.
+if test "${enable_doc+set}" = set; then :
+ enableval=$enable_doc; build_doc=$enableval
+else
+ build_doc=yes
+fi
+
+ if test "x$build_doc" != xno; then
+ BUILD_DOC_TRUE=
+ BUILD_DOC_FALSE='#'
+else
+ BUILD_DOC_TRUE='#'
+ BUILD_DOC_FALSE=
+fi
+
+
+build_tests=yes
+# Check whether --enable-tests was given.
+if test "${enable_tests+set}" = set; then :
+ enableval=$enable_tests; build_tests=$enableval
+else
+ build_tests=yes
+fi
+
+ if test "x$build_tests" != xno; then
+ BUILD_TESTS_TRUE=
+ BUILD_TESTS_FALSE='#'
+else
+ BUILD_TESTS_TRUE='#'
+ BUILD_TESTS_FALSE=
+fi
+
+#
# Substitution
+#
ac_config_files="$ac_config_files Makefile"
-ac_config_files="$ac_config_files po/Makefile.in m4/Makefile"
+ac_config_files="$ac_config_files doc/Makefile po/Makefile.in m4/Makefile"
ac_config_files="$ac_config_files src/Makefile tests/Makefile"
ac_config_files="$ac_config_files lang/Makefile lang/cl/Makefile lang/cl/gpg-error.asd"
-ac_config_files="$ac_config_files src/versioninfo.rc"
+ac_config_files="$ac_config_files src/versioninfo.rc src/gpg-error.w32-manifest"
ac_config_files="$ac_config_files src/gpg-error-config"
@@ -15609,6 +17039,14 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
if test -n "$EXEEXT"; then
am__EXEEXT_TRUE=
am__EXEEXT_FALSE='#'
@@ -15629,6 +17067,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_LD_VERSION_SCRIPT_TRUE}" && test -z "${HAVE_LD_VERSION_SCRIPT_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_LD_VERSION_SCRIPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${HAVE_W32_SYSTEM_TRUE}" && test -z "${HAVE_W32_SYSTEM_FALSE}"; then
as_fn_error $? "conditional \"HAVE_W32_SYSTEM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -15645,10 +17087,22 @@ if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then
as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${FORCE_USE_SYSCFG_TRUE}" && test -z "${FORCE_USE_SYSCFG_FALSE}"; then
+ as_fn_error $? "conditional \"FORCE_USE_SYSCFG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${LANGUAGES_SOME_TRUE}" && test -z "${LANGUAGES_SOME_FALSE}"; then
as_fn_error $? "conditional \"LANGUAGES_SOME\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_TESTS_TRUE}" && test -z "${BUILD_TESTS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
@@ -16046,7 +17500,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by libgpg-error $as_me 1.13, which was
+This file was extended by libgpg-error $as_me 1.27, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -16106,13 +17560,13 @@ $config_headers
Configuration commands:
$config_commands
-Report bugs to <http://bugs.gnupg.org>."
+Report bugs to <https://bugs.gnupg.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-libgpg-error config.status 1.13
+libgpg-error config.status 1.27
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -16606,6 +18060,7 @@ do
"libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
"po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
"po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
"m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
@@ -16614,6 +18069,7 @@ do
"lang/cl/Makefile") CONFIG_FILES="$CONFIG_FILES lang/cl/Makefile" ;;
"lang/cl/gpg-error.asd") CONFIG_FILES="$CONFIG_FILES lang/cl/gpg-error.asd" ;;
"src/versioninfo.rc") CONFIG_FILES="$CONFIG_FILES src/versioninfo.rc" ;;
+ "src/gpg-error.w32-manifest") CONFIG_FILES="$CONFIG_FILES src/gpg-error.w32-manifest" ;;
"src/gpg-error-config") CONFIG_FILES="$CONFIG_FILES src/gpg-error-config" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
@@ -17211,7 +18667,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
case $ac_file$ac_mode in
"depfiles":C) test x"$AMDEP_TRUE" != x"" || {
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
case $CONFIG_FILES in
@@ -17224,7 +18680,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
+ # We used to match only the files named 'Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
@@ -17258,21 +18714,19 @@ $as_echo X"$mf" |
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
+ # from the Makefile without running 'make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
+ test -z "$am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`$as_dirname -- "$file" ||
@@ -17349,7 +18803,7 @@ $as_echo X"$file" |
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# can be downloaded from https://www.gnu.org/licenses/gpl.html, or
# obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -18087,7 +19541,7 @@ _LT_EOF
case "$ac_file" in */Makefile.in)
# Adjust a relative srcdir.
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
- ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
# In autoconf-2.13 it is called $ac_given_srcdir.
# In autoconf-2.50 it is called $srcdir.
@@ -18103,7 +19557,8 @@ _LT_EOF
if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
rm -f "$ac_dir/POTFILES"
test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
- cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
POMAKEFILEDEPS="POTFILES.in"
# ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
# on $ac_dir but don't depend on user-specified configuration
@@ -18114,12 +19569,12 @@ _LT_EOF
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
fi
ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
- # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
else
# The set of available languages was given in configure.in.
- # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
fi
# Compute POFILES
@@ -18230,10 +19685,23 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+tmp=
+if test "$have_w32_system" != yes; then
+ if test x"$gl_use_threads" = xno; then
+ tmp=" NO-THREADS"
+ fi
+fi
echo "
- $PACKAGE_NAME-$PACKAGE_VERSION prepared for make
-
- Revision: 1900266 (6400)
- Platform: $host
+ $PACKAGE_NAME v$PACKAGE_VERSION has been configured as follows:
+ Revision: c1668f6 (49510)
+ Platform: $host$tmp
"
+if test "$gcry_cv_gcc_attribute_aligned" != "yes" ; then
+cat <<G10EOF
+***
+*** Please note that your compiler does not support the GCC style
+*** aligned attribute. Using this software may evoke bus errors.
+***
+G10EOF
+fi
diff --git a/configure.ac b/configure.ac
index 3565b1a..6c5a76c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
# configure.ac for libgpg-error
-# Copyright (C) 2003, 2004, 2006, 2010, 2013 g10 Code GmbH
+# Copyright (C) 2003, 2004, 2006, 2010, 2013-2017 g10 Code GmbH
#
# This file is part of libgpg-error.
#
@@ -14,45 +14,42 @@
# GNU Lesser 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/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
# (Process this file with autoconf to produce a configure script.)
# The following lines are used by ./autogen.sh.
AC_PREREQ(2.59)
-min_automake_version="1.11"
+min_automake_version="1.14"
# To build a release you need to create a tag with the version number
# (git tag -s libgpg-error-n.m) and run "./autogen.sh --force".
# Please bump the version number immediately after the release, do
# another commit, and a push so that the git magic is able to work.
# See below for the LT versions.
-m4_define([mym4_version_major], [1])
-m4_define([mym4_version_minor], [13])
+m4_define([mym4_package],[libgpg-error])
+m4_define([mym4_major], [1])
+m4_define([mym4_minor], [27])
# Below is m4 magic to extract and compute the revision number, the
# decimalized short revision number, a beta version string, and a flag
# indicating a development version (mym4_isgit). Note that the m4
# processing is done by autoconf and not during the configure run.
-m4_define([mym4_version], [mym4_version_major.mym4_version_minor])
-m4_define([mym4_revision],
- m4_esyscmd([git rev-parse --short HEAD | tr -d '\n\r']))
-m4_define([mym4_revision_dec],
- m4_esyscmd_s([echo $((0x$(echo ]mym4_revision[|head -c 4)))]))
-m4_define([mym4_betastring],
- m4_esyscmd_s([git describe --match 'libgpg-error-[0-9].*[0-9]' --long|\
- awk -F- '$4!=0{print"-beta"$4}']))
-m4_define([mym4_isgit],m4_if(mym4_betastring,[],[no],[yes]))
-m4_define([mym4_full_version],[mym4_version[]mym4_betastring])
-
-AC_INIT([libgpg-error],[mym4_full_version],[http://bugs.gnupg.org])
+m4_define([mym4_verslist], m4_split(m4_esyscmd([./autogen.sh --find-version] \
+ mym4_package mym4_major mym4_minor),[:]))
+m4_define([mym4_isbeta], m4_argn(2, mym4_verslist))
+m4_define([mym4_version], m4_argn(4, mym4_verslist))
+m4_define([mym4_revision], m4_argn(7, mym4_verslist))
+m4_define([mym4_revision_dec], m4_argn(8, mym4_verslist))
+m4_esyscmd([echo ]mym4_version[>VERSION])
+AC_INIT([mym4_package],[mym4_version], [https://bugs.gnupg.org])
# LT Version numbers, remember to change them just *before* a release.
# (Code changed: REVISION++)
# (Interfaces added/removed/changed: CURRENT++, REVISION=0)
# (Interfaces added: AGE++)
# (Interfaces removed: AGE=0)
# Note that added error codes don't constitute an interface change.
-LIBGPG_ERROR_LT_CURRENT=11
-LIBGPG_ERROR_LT_AGE=11
+LIBGPG_ERROR_LT_CURRENT=22
+LIBGPG_ERROR_LT_AGE=22
LIBGPG_ERROR_LT_REVISION=0
################################################
@@ -60,12 +57,11 @@ AC_SUBST(LIBGPG_ERROR_LT_CURRENT)
AC_SUBST(LIBGPG_ERROR_LT_AGE)
AC_SUBST(LIBGPG_ERROR_LT_REVISION)
-VERSION_NUMBER=m4_esyscmd(printf "0x%02x%02x00" mym4_version_major \
- mym4_version_minor)
+VERSION_NUMBER=m4_esyscmd(printf "0x%02x%02x00" mym4_major mym4_minor)
AC_SUBST(VERSION_NUMBER)
AC_CONFIG_AUX_DIR([build-aux])
-AM_INIT_AUTOMAKE
+AM_INIT_AUTOMAKE([serial-tests dist-bzip2])
AM_MAINTAINER_MODE
AC_CONFIG_SRCDIR([src/err-sources.h.in])
AC_CONFIG_HEADER([config.h])
@@ -110,6 +106,12 @@ if test "$have_w32_system" != yes; then
gl_THREADLIB_EARLY
fi
+# We build libgpg-error with large file support so that we have a 64
+# bit off_t. Our external interface uses the gpgrt_off_t which is
+# anyway specified as 64 bit. Thus the same libgpg-error can be used
+# by software which is not build with large file support.
+AC_SYS_LARGEFILE
+
LT_PREREQ([2.2.6])
LT_INIT([win32-dll disable-static])
@@ -136,19 +138,25 @@ AH_BOTTOM([
#if defined(HAVE_W32_SYSTEM) && !defined(ENABLE_NLS)
#define ENABLE_NLS 1
#endif
+
+/* Connect the generic estream-printf.c to our framework. */
+#define _ESTREAM_PRINTF_REALLOC _gpgrt_realloc
+#define _ESTREAM_PRINTF_EXTRA_INCLUDE "gpgrt-int.h"
+
/* For building we need to define these macro. */
#define GPG_ERR_ENABLE_GETTEXT_MACROS 1
#define GPG_ERR_ENABLE_ERRNO_MACROS 1
+#define GPGRT_ENABLE_ES_MACROS 1
])
# Note, that autogen.sh greps for the next line.
-AM_GNU_GETTEXT_VERSION([0.17])
+AM_GNU_GETTEXT_VERSION([0.19.3])
AM_GNU_GETTEXT([external])
# Checks for header files.
AC_HEADER_STDC
-AC_CHECK_HEADERS([stdlib.h locale.h])
+AC_CHECK_HEADERS([stdlib.h locale.h stdint.h sys/select.h sys/time.h])
AC_FUNC_STRERROR_R
case "${host_os}" in
solaris*)
@@ -161,13 +169,240 @@ AC_MSG_WARN([[Without strerror_r, gpg_strerror_r might not be thread-safe]]))
;;
esac
-AC_CHECK_FUNCS([flockfile])
+AC_CHECK_FUNCS([flockfile vasprintf])
+#
# Checks for typedefs, structures, and compiler characteristics.
+#
AC_C_CONST
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+AC_HEADER_TIME
+AC_CHECK_SIZEOF(time_t,,[[
+#include <stdio.h>
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+]])
+
+# Find a 64 bit integer type to be used instead of off_t. We prefer
+# the standard integer types over int64_t and finally try long long.
+if test "$ac_cv_sizeof_int" = "8"; then
+ replacement_for_off_t="int"
+elif test "$ac_cv_sizeof_long" = "8"; then
+ replacement_for_off_t="long"
+elif test "$ac_cv_header_stdint_h" = yes; then
+ replacement_for_off_t="int64_t"
+elif test "$ac_cv_sizeof_long_long" = "8"; then
+ replacement_for_off_t="long long"
+else
+ AC_MSG_ERROR([[
+***
+*** No 64 bit signed integer type found. Can't build this library.
+***]])
+fi
+AC_DEFINE_UNQUOTED(REPLACEMENT_FOR_OFF_T, "$replacement_for_off_t",
+ [Used by mkheader to insert the replacement type.])
+
+
+
+#
+# Setup gcc specific options
+#
+AC_MSG_NOTICE([checking for cc features])
+if test "$GCC" = yes; then
+ # Check whether gcc does not emit a diagnostic for unknown -Wno-*
+ # options. This is the case for gcc >= 4.6
+ AC_MSG_CHECKING([if gcc ignores unknown -Wno-* options])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6 )
+#kickerror
+#endif]],[])],[_gcc_silent_wno=yes],[_gcc_silent_wno=no])
+ AC_MSG_RESULT($_gcc_silent_wno)
+
+ # Note that it is okay to use CFLAGS here because these are just
+ # warning options and the user should have a chance of overriding
+ # them.
+ if test "$USE_MAINTAINER_MODE" = "yes"; then
+ CFLAGS="$CFLAGS -O3 -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
+ CFLAGS="$CFLAGS -Wformat -Wno-format-y2k -Wformat-security"
+ if test x"$_gcc_silent_wno" = xyes ; then
+ _gcc_wopt=yes
+ else
+ AC_MSG_CHECKING([if gcc supports -Wno-missing-field-initializers])
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wno-missing-field-initializers"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
+ [_gcc_wopt=yes],[_gcc_wopt=no])
+ AC_MSG_RESULT($_gcc_wopt)
+ CFLAGS=$_gcc_cflags_save;
+ fi
+ if test x"$_gcc_wopt" = xyes ; then
+ CFLAGS="$CFLAGS -W -Wno-sign-compare -Wno-missing-field-initializers"
+ fi
+
+ AC_MSG_CHECKING([if gcc supports -Wdeclaration-after-statement])
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wdeclaration-after-statement"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],_gcc_wopt=yes,_gcc_wopt=no)
+ AC_MSG_RESULT($_gcc_wopt)
+ CFLAGS=$_gcc_cflags_save;
+ if test x"$_gcc_wopt" = xyes ; then
+ CFLAGS="$CFLAGS -Wdeclaration-after-statement"
+ fi
+ else
+ CFLAGS="$CFLAGS -Wall"
+ fi
+
+ AC_MSG_CHECKING([if gcc supports -Wpointer-arith])
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-Wpointer-arith"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],_gcc_psign=yes,_gcc_psign=no)
+ AC_MSG_RESULT($_gcc_psign)
+ CFLAGS=$_gcc_cflags_save;
+ if test x"$_gcc_psign" = xyes ; then
+ CFLAGS="$CFLAGS -Wpointer-arith"
+ fi
+
+ # The undocumented option -Wno-psabi suppresses the annoying
+ # "the ABI of passing union with long double has changed in GCC 4.4"
+ # which is emitted in estream-printf.c but entirely irrelvant
+ # because that union is local to the file.
+ if test x"$_gcc_silent_wno" = xyes ; then
+ CFLAGS="$CFLAGS -Wno-psabi"
+ fi
+fi
+
+#
+# Check whether the compiler supports the GCC style aligned attribute
+#
+AC_CACHE_CHECK([whether the GCC style aligned attribute is supported],
+ [gcry_cv_gcc_attribute_aligned],
+ [gcry_cv_gcc_attribute_aligned=no
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE(
+ [[struct { int a; } foo __attribute__ ((aligned (16)));]])],
+ [gcry_cv_gcc_attribute_aligned=yes])])
+if test "$gcry_cv_gcc_attribute_aligned" = "yes" ; then
+ AC_DEFINE(HAVE_GCC_ATTRIBUTE_ALIGNED,1,
+ [Defined if a GCC style "__attribute__ ((aligned (n))" is supported])
+fi
+
+#
+# Check for ELF visibility support.
+#
+AC_CACHE_CHECK(whether the visibility attribute is supported,
+ gcry_cv_visibility_attribute,
+ [gcry_cv_visibility_attribute=no
+ AC_LANG_CONFTEST([AC_LANG_SOURCE(
+ [[int foo __attribute__ ((visibility ("hidden"))) = 1;
+ int bar __attribute__ ((visibility ("protected"))) = 1;
+ ]])])
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
+ if grep '\.hidden.*foo' conftest.s >/dev/null 2>&1 ; then
+ if grep '\.protected.*bar' conftest.s >/dev/null 2>&1; then
+ gcry_cv_visibility_attribute=yes
+ fi
+ fi
+ fi
+ ])
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ AC_CACHE_CHECK(for broken visibility attribute,
+ gcry_cv_broken_visibility_attribute,
+ [gcry_cv_broken_visibility_attribute=yes
+ AC_LANG_CONFTEST([AC_LANG_SOURCE(
+ [[int foo (int x);
+ int bar (int x) __asm__ ("foo")
+ __attribute__ ((visibility ("hidden")));
+ int bar (int x) { return x; }
+ ]])])
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
+ if grep '\.hidden@<:@ _@:>@foo' conftest.s >/dev/null 2>&1;
+ then
+ gcry_cv_broken_visibility_attribute=no
+ fi
+ fi
+ ])
+fi
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ AC_CACHE_CHECK(for broken alias attribute,
+ gcry_cv_broken_alias_attribute,
+ [gcry_cv_broken_alias_attribute=yes
+ AC_LANG_CONFTEST([AC_LANG_SOURCE(
+ [[extern int foo (int x) __asm ("xyzzy");
+ int bar (int x) { return x; }
+ extern __typeof (bar) foo __attribute ((weak, alias ("bar")));
+ extern int dfoo;
+ extern __typeof (dfoo) dfoo __asm ("abccb");
+ int dfoo = 1;
+ ]])])
+
+ if ${CC-cc} -Werror -S conftest.c -o conftest.s \
+ 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
+ if grep 'xyzzy' conftest.s >/dev/null 2>&1 && \
+ grep 'abccb' conftest.s >/dev/null 2>&1; then
+ gcry_cv_broken_alias_attribute=no
+ fi
+ fi
+ ])
+fi
+if test "$gcry_cv_visibility_attribute" = "yes"; then
+ AC_CACHE_CHECK(if gcc supports -fvisibility=hidden,
+ gcry_cv_gcc_has_f_visibility,
+ [gcry_cv_gcc_has_f_visibility=no
+ _gcc_cflags_save=$CFLAGS
+ CFLAGS="-fvisibility=hidden"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
+ gcry_cv_gcc_has_f_visibility=yes)
+ CFLAGS=$_gcc_cflags_save;
+ ])
+fi
+if test "$gcry_cv_visibility_attribute" = "yes" \
+ && test "$gcry_cv_broken_visibility_attribute" != "yes" \
+ && test "$gcry_cv_broken_alias_attribute" != "yes" \
+ && test "$gcry_cv_gcc_has_f_visibility" = "yes"
+ then
+ AC_DEFINE(GPGRT_USE_VISIBILITY, 1,
+ [Define to use the GNU C visibility attribute.])
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+fi
+
+#
+# Check whether ld supports a version script.
+# (Actually not a check but a list of systems which are known to support it.)
+#
+have_ld_version_script=no
+case "${host}" in
+ *-*-linux*)
+ have_ld_version_script=yes
+ ;;
+ *-*-gnu*)
+ have_ld_version_script=yes
+ ;;
+esac
+AC_ARG_ENABLE([ld-version-script],
+ AC_HELP_STRING([--enable-ld-version-script],
+ [enable/disable use of linker version script.
+ (default is system dependent)]),
+ [have_ld_version_script=$enableval],
+ [ : ] )
+AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
+
+#
# Check for thread library.
#
# Windows has always thread support; thus we don't bother to test for
@@ -191,9 +426,29 @@ else
fi
fi
+# Default value for GPG_ERROR_CONFIG_LIBS
+config_libs="-lgpg-error"
+#
+# Check for other libraries (now only for -lrt).
+#
+LIB_SCHED_YIELD=
+AC_SUBST([LIB_SCHED_YIELD])
+AC_SEARCH_LIBS([sched_yield], [rt posix4],
+ [if test "$ac_cv_search_sched_yield" != "none required"; then
+ LIB_SCHED_YIELD=$ac_cv_search_sched_yield
+ config_libs="$config_libs $LIB_SCHED_YIELD"
+ fi])
+
+#
+# Prepare building of estream
+#
+estream_INIT
+
+#
# Substitution used for gpg-error-config
-GPG_ERROR_CONFIG_LIBS="-lgpg-error"
+#
+GPG_ERROR_CONFIG_LIBS="$config_libs"
if test "x$LIBTHREAD" != x; then
GPG_ERROR_CONFIG_LIBS="${GPG_ERROR_CONFIG_LIBS} ${LIBTHREAD}"
fi
@@ -218,7 +473,10 @@ AC_SUBST(GPG_ERROR_CONFIG_ISUBDIRAFTER)
AC_SUBST(GPG_ERROR_CONFIG_HOST)
+#
# Special defines for certain platforms
+#
+force_use_syscfg=no
if test "$have_w32_system" = yes; then
AC_DEFINE(HAVE_W32_SYSTEM,1,[Defined if we run on a W32 API based system])
if test "$have_w64_system" = yes; then
@@ -228,11 +486,17 @@ if test "$have_w32_system" = yes; then
AC_DEFINE(HAVE_W32CE_SYSTEM,1,[Defined if we run on WindowsCE])
GPG_ERROR_CONFIG_ISUBDIRAFTER="gpg-extra"
fi
+ force_use_syscfg=yes
+fi
+if test x$cross_compiling = xyes; then
+ force_use_syscfg=yes
fi
+
AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes)
AM_CONDITIONAL(HAVE_W64_SYSTEM, test "$have_w64_system" = yes)
AM_CONDITIONAL(HAVE_W32CE_SYSTEM, test "$have_w32ce_system" = yes)
AM_CONDITIONAL(CROSS_COMPILING, test x$cross_compiling = xyes)
+AM_CONDITIONAL(FORCE_USE_SYSCFG, test x$force_use_syscfg = xyes)
AC_DEFINE_UNQUOTED(HOST_TRIPLET_STRING, "$host", [The host triplet])
@@ -246,37 +510,74 @@ AC_DEFINE_UNQUOTED(BUILD_REVISION, "$BUILD_REVISION",
[GIT commit id revision used to build this package])
changequote(,)dnl
-BUILD_FILEVERSION=`echo "$PACKAGE_VERSION"|sed 's/\([0-9.]*\).*/\1./;s/\./,/g'`
+BUILD_VERSION=`echo "$PACKAGE_VERSION"|sed 's/\([0-9.]*\).*/\1./'`
changequote([,])dnl
-BUILD_FILEVERSION="${BUILD_FILEVERSION}0,mym4_revision_dec"
+BUILD_VERSION="${BUILD_VERSION}0.mym4_revision_dec"
+BUILD_FILEVERSION=`echo "${BUILD_VERSION}" | tr . ,`
+AC_SUBST(BUILD_VERSION)
AC_SUBST(BUILD_FILEVERSION)
-BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+AC_ARG_ENABLE([build-timestamp],
+ AC_HELP_STRING([--enable-build-timestamp],
+ [set an explicit build timestamp for reproducibility.
+ (default is the current time in ISO-8601 format)]),
+ [if test "$enableval" = "yes"; then
+ BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date`
+ else
+ BUILD_TIMESTAMP="$enableval"
+ fi],
+ [BUILD_TIMESTAMP="<none>"])
AC_SUBST(BUILD_TIMESTAMP)
AC_DEFINE_UNQUOTED(BUILD_TIMESTAMP, "$BUILD_TIMESTAMP",
[The time this package was configured for a build])
-AC_ARG_ENABLE(languages,
-[ --disable-languages do not build support for other languages than C])
+AC_ARG_ENABLE(languages, AC_HELP_STRING([--disable-languages],
+ [do not build support for other languages than C]))
AM_CONDITIONAL([LANGUAGES_SOME], [test "x$enable_languages" != xno])
+build_doc=yes
+AC_ARG_ENABLE([doc], AC_HELP_STRING([--disable-doc],
+ [do not build the documentation]),
+ build_doc=$enableval, build_doc=yes)
+AM_CONDITIONAL([BUILD_DOC], [test "x$build_doc" != xno])
+build_tests=yes
+AC_ARG_ENABLE([tests], AC_HELP_STRING([--disable-tests],
+ [do not build the tests]),
+ build_tests=$enableval, build_tests=yes)
+AM_CONDITIONAL([BUILD_TESTS], [test "x$build_tests" != xno])
+
+#
# Substitution
+#
AC_CONFIG_FILES([Makefile])
-AC_CONFIG_FILES([po/Makefile.in m4/Makefile])
+AC_CONFIG_FILES([doc/Makefile po/Makefile.in m4/Makefile])
AC_CONFIG_FILES([src/Makefile tests/Makefile])
AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpg-error.asd])
-AC_CONFIG_FILES([src/versioninfo.rc])
+AC_CONFIG_FILES([src/versioninfo.rc src/gpg-error.w32-manifest])
AC_CONFIG_FILES([src/gpg-error-config], [chmod +x src/gpg-error-config])
AC_OUTPUT
+tmp=
+if test "$have_w32_system" != yes; then
+ if test x"$gl_use_threads" = xno; then
+ tmp=" NO-THREADS"
+ fi
+fi
echo "
- $PACKAGE_NAME-$PACKAGE_VERSION prepared for make
+ $PACKAGE_NAME v$PACKAGE_VERSION has been configured as follows:
Revision: mym4_revision (mym4_revision_dec)
- Platform: $host
-
+ Platform: $host$tmp
"
+if test "$gcry_cv_gcc_attribute_aligned" != "yes" ; then
+cat <<G10EOF
+***
+*** Please note that your compiler does not support the GCC style
+*** aligned attribute. Using this software may evoke bus errors.
+***
+G10EOF
+fi
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..565bb09
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,79 @@
+# Makefile.am for libgpg-error documentation
+# Copyright (C) 2014 g10 Code GmbH
+#
+# This file is part of libgpg-error.
+#
+# libgpg-error is free software; you can redistribute it 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.
+#
+# libgpg-error is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
+
+
+EXTRA_DIST = HACKING errorref.txt \
+ yat2m.c
+
+DISTCLEANFILES = gpgrt.cps yat2m-stamp.tmp yat2m-stamp $(myman_pages)
+CLEANFILES = yat2m errorref.txt.x
+
+info_TEXINFOS = gpgrt.texi
+gpgrt_TEXINFOS = lgpl.texi gpl.texi
+
+YAT2M_OPTIONS = -I $(srcdir) \
+ --release "Libgpg-error @PACKAGE_VERSION@" --source "GnuPG"
+
+myman_sources = gpgrt.texi
+myman_pages = gpg-error-config.1
+
+man_MANS = $(myman_pages)
+
+yat2m: yat2m.c
+ $(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c
+
+
+yat2m-stamp: $(myman_sources)
+ @rm -f yat2m-stamp.tmp
+ @touch yat2m-stamp.tmp
+ for file in $(myman_sources) ; do \
+ ./yat2m $(YAT2M_OPTIONS) --store \
+ `test -f '$$file' || echo '$(srcdir)/'`$$file ; done
+ @mv -f yat2m-stamp.tmp $@
+
+yat2m-stamp: yat2m
+
+$(myman_pages) : yat2m-stamp
+ @if test -f $@; then :; else \
+ trap 'rm -rf yat2m-stamp yat2m-lock' 1 2 13 15; \
+ if mkdir yat2m-lock 2>/dev/null; then \
+ rm -f yat2m-stamp; \
+ $(MAKE) $(AM_MAKEFLAGS) yat2m-stamp; \
+ rmdir yat2m-lock; \
+ else \
+ while test -d yat2m-lock; do sleep 1; done; \
+ test -f yat2m-stamp; exit $$?; \
+ fi; \
+ fi
+
+# Make sure that gpgrt.texi is touched if any other texi file has
+# been modified. This is required so that the version.texi magic
+# updates the release date.
+gpgrt.texi : $(gpgrt_TEXINFOS)
+ touch $(srcdir)/gpgrt.texi
+
+errorref.txt.x : errorref.txt
+ sed '/^##/ d' $< >$@
+ echo "# Installed by $(PACKAGE_NAME) $(PACKAGE_VERSION)" >>$@
+
+install-data-local: errorref.txt.x
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ $(INSTALL_DATA) errorref.txt.x $(DESTDIR)$(pkgdatadir)/errorref.txt
+
+uninstall-local:
+ -@rm $(DESTDIR)$(pkgdatadir)/errorref.txt
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..eccc77f
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,929 @@
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am for libgpg-error documentation
+# Copyright (C) 2014 g10 Code GmbH
+#
+# This file is part of libgpg-error.
+#
+# libgpg-error is free software; you can redistribute it 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.
+#
+# libgpg-error is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(gpgrt_TEXINFOS) $(top_srcdir)/build-aux/mdate-sh \
+ $(srcdir)/version.texi $(srcdir)/stamp-vti \
+ $(top_srcdir)/build-aux/texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
+am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
+am__v_DVIPS_0 = @echo " DVIPS " $@;
+am__v_DVIPS_1 =
+AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@)
+am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@)
+am__v_MAKEINFO_0 = @echo " MAKEINFO" $@;
+am__v_MAKEINFO_1 =
+AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@)
+am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@)
+am__v_INFOHTML_0 = @echo " INFOHTML" $@;
+am__v_INFOHTML_1 =
+AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@)
+am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@)
+am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@;
+am__v_TEXI2DVI_1 =
+AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@)
+am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@)
+am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@;
+am__v_TEXI2PDF_1 =
+AM_V_texinfo = $(am__v_texinfo_@AM_V@)
+am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@)
+am__v_texinfo_0 = -q
+am__v_texinfo_1 =
+AM_V_texidevnull = $(am__v_texidevnull_@AM_V@)
+am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
+am__v_texidevnull_0 = > /dev/null
+am__v_texidevnull_1 =
+INFO_DEPS = $(srcdir)/gpgrt.info
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
+DVIS = gpgrt.dvi
+PDFS = gpgrt.pdf
+PSS = gpgrt.ps
+HTMLS = gpgrt.html
+TEXINFOS = gpgrt.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_FILEVERSION = @BUILD_FILEVERSION@
+BUILD_REVISION = @BUILD_REVISION@
+BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GPG_ERROR_CONFIG_CFLAGS = @GPG_ERROR_CONFIG_CFLAGS@
+GPG_ERROR_CONFIG_HOST = @GPG_ERROR_CONFIG_HOST@
+GPG_ERROR_CONFIG_ISUBDIRAFTER = @GPG_ERROR_CONFIG_ISUBDIRAFTER@
+GPG_ERROR_CONFIG_LIBS = @GPG_ERROR_CONFIG_LIBS@
+GPG_ERROR_CONFIG_MT_CFLAGS = @GPG_ERROR_CONFIG_MT_CFLAGS@
+GPG_ERROR_CONFIG_MT_LIBS = @GPG_ERROR_CONFIG_MT_LIBS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGPG_ERROR_LT_AGE = @LIBGPG_ERROR_LT_AGE@
+LIBGPG_ERROR_LT_CURRENT = @LIBGPG_ERROR_LT_CURRENT@
+LIBGPG_ERROR_LT_REVISION = @LIBGPG_ERROR_LT_REVISION@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTHREAD = @LIBTHREAD@
+LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBTHREAD = @LTLIBTHREAD@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+RC = @RC@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+VERSION_NUMBER = @VERSION_NUMBER@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = HACKING errorref.txt \
+ yat2m.c
+
+DISTCLEANFILES = gpgrt.cps yat2m-stamp.tmp yat2m-stamp $(myman_pages)
+CLEANFILES = yat2m errorref.txt.x
+info_TEXINFOS = gpgrt.texi
+gpgrt_TEXINFOS = lgpl.texi gpl.texi
+YAT2M_OPTIONS = -I $(srcdir) \
+ --release "Libgpg-error @PACKAGE_VERSION@" --source "GnuPG"
+
+myman_sources = gpgrt.texi
+myman_pages = gpg-error-config.1
+man_MANS = $(myman_pages)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+.texi.info:
+ $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ $(am__cd) $(srcdir); \
+ else \
+ rc=$$?; \
+ $(am__cd) $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \
+ $<
+
+.texi.pdf:
+ $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \
+ $<
+
+.texi.html:
+ $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp)
+ $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@ && mv $(@:.html=.htp) $@; \
+ else \
+ rm -rf $(@:.html=.htp); exit 1; \
+ fi
+$(srcdir)/gpgrt.info: gpgrt.texi $(srcdir)/version.texi $(gpgrt_TEXINFOS)
+gpgrt.dvi: gpgrt.texi $(srcdir)/version.texi $(gpgrt_TEXINFOS)
+gpgrt.pdf: gpgrt.texi $(srcdir)/version.texi $(gpgrt_TEXINFOS)
+gpgrt.html: gpgrt.texi $(srcdir)/version.texi $(gpgrt_TEXINFOS)
+$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: gpgrt.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./gpgrt.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/gpgrt.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+ $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) $(AM_V_texinfo) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+ done
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+uninstall-pdf-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(psdir)/$$f"; \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+ if test -f $$file; then \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f "$(distdir)/$$relfile" || \
+ cp -p $$file "$(distdir)/$$relfile"; \
+ else :; fi; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf gpgrt.t2d gpgrt.t2p
+
+clean-aminfo:
+ -test -z "gpgrt.dvi gpgrt.pdf gpgrt.ps gpgrt.html" \
+ || rm -rf gpgrt.dvi gpgrt.pdf gpgrt.ps gpgrt.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+install-man1: $(man_MANS)
+ @$(NORMAL_INSTALL)
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
+ } | while read p; do \
+ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; echo "$$p"; \
+ done | \
+ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+ sed 'N;N;s,\n, ,g' | { \
+ list=; while read file base inst; do \
+ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+ fi; \
+ done; \
+ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+ while read files; do \
+ test -z "$$files" || { \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+ done; }
+
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list=''; test -n "$(man1dir)" || exit 0; \
+ files=`{ for i in $$list; do echo "$$i"; done; \
+ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+ sed -n '/\.1[a-z]*$$/p'; \
+ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-data-local install-info-am install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+ done
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ $(am__strip_dir) \
+ d2=$$d$$p; \
+ if test -d "$$d2"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+ else \
+ list2="$$list2 $$d2"; \
+ fi; \
+ done; \
+ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+ done; }
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
+ fi; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ echo "$$ifile"; \
+ else : ; fi; \
+ done; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+ @$(POST_INSTALL)
+ @if $(am__can_run_installinfo); then \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am: $(PDFS)
+ @$(NORMAL_INSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-local uninstall-man uninstall-pdf-am uninstall-ps-am
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
+ clean-libtool cscopelist-am ctags-am dist-info distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-man1 \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-vti pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-dvi-am uninstall-html-am \
+ uninstall-info-am uninstall-local uninstall-man uninstall-man1 \
+ uninstall-pdf-am uninstall-ps-am
+
+
+yat2m: yat2m.c
+ $(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c
+
+yat2m-stamp: $(myman_sources)
+ @rm -f yat2m-stamp.tmp
+ @touch yat2m-stamp.tmp
+ for file in $(myman_sources) ; do \
+ ./yat2m $(YAT2M_OPTIONS) --store \
+ `test -f '$$file' || echo '$(srcdir)/'`$$file ; done
+ @mv -f yat2m-stamp.tmp $@
+
+yat2m-stamp: yat2m
+
+$(myman_pages) : yat2m-stamp
+ @if test -f $@; then :; else \
+ trap 'rm -rf yat2m-stamp yat2m-lock' 1 2 13 15; \
+ if mkdir yat2m-lock 2>/dev/null; then \
+ rm -f yat2m-stamp; \
+ $(MAKE) $(AM_MAKEFLAGS) yat2m-stamp; \
+ rmdir yat2m-lock; \
+ else \
+ while test -d yat2m-lock; do sleep 1; done; \
+ test -f yat2m-stamp; exit $$?; \
+ fi; \
+ fi
+
+# Make sure that gpgrt.texi is touched if any other texi file has
+# been modified. This is required so that the version.texi magic
+# updates the release date.
+gpgrt.texi : $(gpgrt_TEXINFOS)
+ touch $(srcdir)/gpgrt.texi
+
+errorref.txt.x : errorref.txt
+ sed '/^##/ d' $< >$@
+ echo "# Installed by $(PACKAGE_NAME) $(PACKAGE_VERSION)" >>$@
+
+install-data-local: errorref.txt.x
+ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+ $(INSTALL_DATA) errorref.txt.x $(DESTDIR)$(pkgdatadir)/errorref.txt
+
+uninstall-local:
+ -@rm $(DESTDIR)$(pkgdatadir)/errorref.txt
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/errorref.txt b/doc/errorref.txt
new file mode 100644
index 0000000..284123b
--- /dev/null
+++ b/doc/errorref.txt
@@ -0,0 +1,1122 @@
+# errorref.txt - Description of error codes
+# Copyright (C) 2003-2004, 2010, 2013-2016 g10 Code GmbH
+#
+# This file is part of libgpg-error.
+#
+# libgpg-error is free software; you can redistribute it 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.
+#
+# libgpg-error is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
+##
+## Note that lines with a leading double hash will not installed.
+## Please do not put any tabs into this file.
+##
+## find ~/s/{gnupg,libgpg-error,libksba,libgcrypt,gpgme,gpa} -type f \
+## -name '*.[ch]' -print0 | xargs -0 grep -n GPG_ERR_
+
+
+GPG_ERR_UNKNOWN_PACKET Unknown packet
+
+ GNUPG: - Redefined to G10ERR_UNKNOWN_PACKET in gpg.
+
+GPG_ERR_UNKNOWN_VERSION Unknown version in packet
+
+ Used by GnuPG 2.1 to identify valid OpenPGP packets with an
+ unknown version.
+
+GPG_ERR_PUBKEY_ALGO Invalid public key algorithm
+
+ GNUPG: - Redefined to G10ERR_PUBKEY_ALGO in gpg.
+ - Public key algorithm is not allowed by OpenPGP.
+ GCRYPT: - Public key algorithm is not defined or not available.
+ Note that this is also the case if the algorithm has
+ been disabled.
+ - [version < 1.5] Checking of the RSA secret key failed
+ (consistency check).
+
+GPG_ERR_DIGEST_ALGO Invalid digest algorithm
+
+ GNUPG: - Digest algorithm is not supported.
+ - Redefined to G10ERR_PUBKEY_ALGO in gpg.
+ - Digest algorithm is not allowed by OpenPGP.
+ - Unsupported algorithm given to "--hash=" option of
+ certain Assuan server commands.
+ - Signature creation or verification failed due to
+ an unsupported hash algorithm.
+ GCRYPT: - Digest key algorithm is not defined or not available.
+ Note that this is also the case if the algorithm has
+ been disabled.
+ - Unsupported digest algorithm in a selftest.
+ - Invalid digest algorithm used in FIPS mode. Note that
+ in enforced-FIPS mode there is no such error return.
+ - Message digested or HMAC computation finished with no
+ message algorithm enabled for the hash context.
+ - Bad digest algorithm given to public key function.
+
+GPG_ERR_BAD_PUBKEY Bad public key
+
+ GNUPG: - Redefined to G10ERR_BAD_PUBKEY in gpg.
+ - Missing public or domain parameter in an s-expression.
+ If the curve name is mssing GPG_ERR_INV_CURVE may be
+ used as well.
+
+GPG_ERR_BAD_SECKEY Bad secret key
+
+ GNUPG: - Invalid format of a S-expression encoded private key in
+ gpg-agent.
+ - Missing secret parameter in an s-expression.
+ - A protected or shadowed private key was passed to the
+ OpenPGP card application for storing it on the card.
+ - A private key passed to the OpenPGP card application does
+ not match the requirements of the card or misses required
+ parameters.
+ - Gpg'agents import key command is not able to convert
+ the key to the internal format.
+ GCRYPT: - Checking the secret key failed (consistency check).
+
+
+GPG_ERR_BAD_SIGNATURE Bad signature
+
+ GNUPG: - Redefined to G10ERR_BAD_SIGN in gpg.
+ - The MDC check of an OpenPGP encrypted message failed.
+ - A OpenPGP key signature did not verify.
+ - A signature with a key flagged as "never trust" was made.
+ GCRYPT: - A public key signature did not verify.
+
+GPG_ERR_NO_PUBKEY No public key
+
+ GNUPG: - Redefined to G10ERR_NO_PUBKEY in gpg.
+ - A key was requested from an OpenPGP card but the key is
+ not stored on the card.
+ - The public key could not be retrieved from a corresponding
+ certificate on a card (command READKEY in scd).
+ - A requested certificate was not found or an unspecified
+ error occurred while selecting a X.509 certificate in
+ gpgsm.
+ - The specified certificate or key was not found. This
+ does not necessary mean that the certifciate is not
+ available but the specification method may not be usable
+ for the given certificate. May also happen for
+ certificates somewhere in the chain while validaiting a
+ certificate chain.
+ - The requested encryption certificate was not found.
+ - A certificate specified in a CMS message is not
+ available and thus the signature could not be verified
+ or details of the certificate be shown.
+ GPA: - No key was given for encryption.
+ - The selected encryption protocol is not available.
+
+GPG_ERR_CHECKSUM Checksum error
+
+ GNUPG: - The checksum of an unprotected OpenPGP secret key packet
+ is wrong.
+ GCRYPT: - Decryption in AESWRAP mode does not match the expected IV.
+ [more to come]
+
+GPG_ERR_BAD_PASSPHRASE Bad passphrase
+
+ GNUPG: - The entered passphrase does not verify
+
+GPG_ERR_CIPHER_ALGO Invalid cipher algorithm
+
+GPG_ERR_KEYRING_OPEN Cannot open keyring
+
+GPG_ERR_INV_PACKET Invalid packet
+
+GPG_ERR_INV_ARMOR Invalid armor
+
+GPG_ERR_NO_USER_ID No user ID
+
+GPG_ERR_NO_SECKEY No secret key
+
+ NTBTLS: - No private key or pre-shared key available.
+
+GPG_ERR_WRONG_SECKEY Wrong secret key used
+
+GPG_ERR_BAD_KEY Bad session key
+
+ GNUPG: - gpg-agent's command IMPORT_KEY or EXPORT_KEY is used
+ without a prior KEYWRAP_KEY command.
+
+ [more to come]
+
+
+GPG_ERR_COMPR_ALGO Unknown compression algorithm
+
+GPG_ERR_NO_PRIME Number is not prime
+
+GPG_ERR_NO_ENCODING_METHOD Invalid encoding method
+
+GPG_ERR_NO_ENCRYPTION_SCHEME Invalid encryption scheme
+
+GPG_ERR_NO_SIGNATURE_SCHEME Invalid signature scheme
+
+GPG_ERR_INV_ATTR Invalid attribute
+
+
+GPG_ERR_NO_VALUE No value
+
+ GNUPG: - A timestamp value is expect but there is none.
+ KSBA: - A timestamp value is expect but there is none.
+ - A certificate is missing a required property.
+ - A CMS object is missing a required property.
+ - Converting a Distinguised Name to an RFC2253 string failed.
+
+
+GPG_ERR_NOT_FOUND Not found
+
+ A search operation did not return a matching value.
+
+
+GPG_ERR_VALUE_NOT_FOUND Value not found
+
+ GNUPG: - A keyblock or a cert object was requested but not
+ found. This might indicate an internal error here.
+
+
+GPG_ERR_SYNTAX Syntax error
+
+GPG_ERR_BAD_MPI Bad MPI value
+
+GPG_ERR_INV_PASSPHRASE Invalid passphrase
+
+ GNUPG: - Required constraints of the passphrase are not met.
+
+GPG_ERR_SIG_CLASS Invalid signature class
+
+GPG_ERR_RESOURCE_LIMIT Resources exhausted
+
+GPG_ERR_INV_KEYRING Invalid keyring
+
+GPG_ERR_TRUSTDB Trust DB error
+
+
+GPG_ERR_BAD_CERT Bad certificate
+
+ NTBTLS: - No subject found in the certifciate.
+
+
+GPG_ERR_INV_USER_ID Invalid user ID
+
+ GNUPG: - Used to indicate a bad specification of a user id.
+ [more to come]
+
+
+GPG_ERR_UNEXPECTED Unexpected error
+
+GPG_ERR_TIME_CONFLICT Time conflict
+
+GPG_ERR_KEYSERVER Keyserver error
+
+
+GPG_ERR_WRONG_PUBKEY_ALGO Wrong public key algorithm
+
+ GNUPG: - The algorithm is not expected. For example a DSA
+ algorithm is used where a non-DSA algorithm is expected
+ or vice versa. May indicate an internal error.
+ NTBTLS: - Public key type mismatch. The peer presented a
+ different key type than requested.
+
+
+GPG_ERR_TRIBUTE_TO_D_A Tribute to D. A.
+
+GPG_ERR_WEAK_KEY Weak encryption key
+
+GPG_ERR_INV_KEYLEN Invalid key length
+
+GPG_ERR_INV_ARG Invalid argument
+
+ GCRYPT: - Unsupported length of input data in encrypt or decrypt
+ cipher functions. For example not matching the block
+ lengths of the algorithm.
+ - Incompatible args given; e.g. two or none if exactly one
+ is required.
+ [more to come]
+
+
+GPG_ERR_BAD_URI Syntax error in URI
+
+GPG_ERR_INV_URI Invalid URI
+
+GPG_ERR_NETWORK Network error
+
+GPG_ERR_UNKNOWN_HOST Unknown host
+
+ Used instead of the non-portable EHOSTNOTFOUND which is
+ returned by some systems as a mapping of h_errno's
+ HOST_NOT_FOUND
+
+
+GPG_ERR_SELFTEST_FAILED Selftest failed
+
+GPG_ERR_NOT_ENCRYPTED Data not encrypted
+
+GPG_ERR_NOT_PROCESSED Data not processed
+
+GPG_ERR_UNUSABLE_PUBKEY Unusable public key
+
+GPG_ERR_UNUSABLE_SECKEY Unusable secret key
+
+GPG_ERR_INV_VALUE Invalid value
+
+ NTBTLS: - A DH parameter is out of range
+
+
+GPG_ERR_BAD_CERT_CHAIN Bad certificate chain
+
+GPG_ERR_MISSING_CERT Missing certificate
+
+ NTBTLS: - The server needs to send a certifciate but none has been
+ set. See also GPG_ERR_MISSING_ISSUER_CERT and
+ GPG_ERR_MISSING_CLIENT_CERT.
+
+
+
+GPG_ERR_NO_DATA No data
+
+GPG_ERR_BUG Bug
+
+GPG_ERR_NOT_SUPPORTED Not supported
+
+ Used if a feature is currently not supported but may be
+ enabled for example using a program option. Commonly used if
+ a feature has been disabled by an administrator. See also
+ GPG_ERR_NOT_ENABLED. Sometimes also used for features which
+ are not yet supported.
+
+
+GPG_ERR_INV_OP Invalid operation code
+
+GPG_ERR_TIMEOUT Timeout
+
+ Some function or network access timed out.
+
+GPG_ERR_INTERNAL Internal error
+
+GPG_ERR_EOF_GCRYPT EOF (gcrypt)
+
+GPG_ERR_INV_OBJ Invalid object
+
+GPG_ERR_TOO_SHORT Provided object is too short
+
+GPG_ERR_TOO_LARGE Provided object is too large
+
+GPG_ERR_NO_OBJ Missing item in object
+
+GPG_ERR_NOT_IMPLEMENTED Not implemented
+
+ NTBTLS: - The requested feature is not implemented.
+
+GPG_ERR_CONFLICT Conflicting use
+
+ NTBTLS: - Function has already been called and may not be called
+ again at this protocol state.
+ GNUPG: - Returned by g13 when creating a new container on a device
+ which seems to be in use.
+
+
+GPG_ERR_INV_CIPHER_MODE Invalid cipher mode
+
+GPG_ERR_INV_FLAG Invalid flag
+
+ GPGME: Used to indicate an invalid combination of flags.
+
+
+GPG_ERR_INV_HANDLE Invalid handle
+
+GPG_ERR_TRUNCATED Result truncated
+
+GPG_ERR_INCOMPLETE_LINE Incomplete line
+
+GPG_ERR_INV_RESPONSE Invalid response
+
+GPG_ERR_NO_AGENT No agent running
+
+GPG_ERR_AGENT agent error
+
+GPG_ERR_INV_DATA Invalid data
+
+ GNUPG: - Used in app-openpgp.c for a badly formatted request.
+ GCRYPT: - No passphrase given for gcry_kdf_derive.
+ - An opaque MPI is given to a public key function but not
+ expected.
+
+GPG_ERR_ASSUAN_SERVER_FAULT Unspecific Assuan server fault
+
+GPG_ERR_ASSUAN General Assuan error
+
+ GNUPG: - Used by Assuan command handler if they fail to do basic
+ things like an es_fdopen or es_fopencookie.
+
+
+GPG_ERR_INV_SESSION_KEY Invalid session key
+
+GPG_ERR_INV_SEXP Invalid S-expression
+
+GPG_ERR_UNSUPPORTED_ALGORITHM Unsupported algorithm
+
+GPG_ERR_NO_PIN_ENTRY No pinentry
+
+GPG_ERR_PIN_ENTRY pinentry error
+
+GPG_ERR_BAD_PIN Bad PIN
+
+GPG_ERR_INV_NAME Invalid name
+
+ GNUPG: - Formerly used in GPGSM to indicate an error in
+ the specification of a user id. Later replaced by
+ GPG_ERR_INV_USER_ID.
+ - In G13 to indicate a bad file name (e.g. one with
+ an embedded Nul byte when given as escaped string.
+ - In SCDAEMON for an unknown attribute name.
+
+ Also used for URLs which have non-acceptable characters for the
+ specific application.
+
+ [more to come]
+
+GPG_ERR_BAD_DATA Bad data
+
+GPG_ERR_INV_PARAMETER Invalid parameter
+
+ GNUPG: - Returned if gpg-agent sends a new generated key with
+ unknown parameter names.
+ - Invalid parameter in the parameter file for key
+ generation by gpgsm.
+
+GPG_ERR_WRONG_CARD Wrong card
+
+GPG_ERR_NO_DIRMNGR No dirmngr
+
+GPG_ERR_DIRMNGR dirmngr error
+
+GPG_ERR_CERT_REVOKED Certificate revoked
+
+GPG_ERR_NO_CRL_KNOWN No CRL known
+
+GPG_ERR_CRL_TOO_OLD CRL too old
+
+GPG_ERR_LINE_TOO_LONG Line too long
+
+GPG_ERR_NOT_TRUSTED Not trusted
+
+GPG_ERR_CANCELED Operation cancelled
+
+GPG_ERR_BAD_CA_CERT Bad CA certificate
+
+GPG_ERR_CERT_EXPIRED Certificate expired
+
+GPG_ERR_CERT_TOO_YOUNG Certificate too young
+
+GPG_ERR_UNSUPPORTED_CERT Unsupported certificate
+
+GPG_ERR_UNKNOWN_SEXP Unknown S-expression
+
+GPG_ERR_UNSUPPORTED_PROTECTION Unsupported protection
+
+GPG_ERR_CORRUPTED_PROTECTION Corrupted protection
+
+GPG_ERR_AMBIGUOUS_NAME Ambiguous name
+
+GPG_ERR_CARD Card error
+
+GPG_ERR_CARD_RESET Card reset required
+
+GPG_ERR_CARD_REMOVED Card removed
+
+GPG_ERR_INV_CARD Invalid card
+
+GPG_ERR_CARD_NOT_PRESENT Card not present
+
+GPG_ERR_NO_PKCS15_APP No PKCS15 application
+
+GPG_ERR_NOT_CONFIRMED Not confirmed
+
+GPG_ERR_CONFIGURATION Configuration error
+
+GPG_ERR_NO_POLICY_MATCH No policy match
+
+GPG_ERR_INV_INDEX Invalid index
+
+GPG_ERR_INV_ID Invalid ID
+
+GPG_ERR_NO_SCDAEMON No SmartCard daemon
+
+GPG_ERR_SCDAEMON SmartCard daemon error
+
+GPG_ERR_UNSUPPORTED_PROTOCOL Unsupported protocol
+
+ GPG: - An unsupported keyserver protocol.
+ GPG_AGENT: - Invalid shadow_info protocol (not "t1-v1")
+ LIBKSBA: - Unknown OID of the OCSP response bytes
+ GPGME: - GPGME_PROTOCOL_xxx not supported.
+ NTBTLS: - Handshake protocol version not supported.
+
+GPG_ERR_BAD_PIN_METHOD Bad PIN method
+
+GPG_ERR_CARD_NOT_INITIALIZED Card not initialized
+
+ SCDAEMON: - A card function is called but the card has not yet
+ been initialized. This may be due to a conflict with
+ another card using connection or due to a bug.
+
+GPG_ERR_UNSUPPORTED_OPERATION Unsupported operation
+
+GPG_ERR_WRONG_KEY_USAGE Wrong key usage
+
+ GNUPG: - Key usage not possible with selected algorithm.
+
+GPG_ERR_NOTHING_FOUND Nothing found
+
+ Indicates that the operation was not possible because nothing has
+ been found. For example an update request for non existent data.
+
+GPG_ERR_WRONG_BLOB_TYPE Wrong blob type
+
+GPG_ERR_MISSING_VALUE Missing value
+
+ GNUPG: - Not enough parameters for a secret key send to gpg-agent.
+
+ GCRYPT: - A required parameter has not been given.
+
+
+GPG_ERR_HARDWARE Hardware problem
+
+GPG_ERR_PIN_BLOCKED PIN blocked
+
+GPG_ERR_USE_CONDITIONS Conditions of use not satisfied
+
+GPG_ERR_PIN_NOT_SYNCED PINs are not synced
+
+GPG_ERR_INV_CRL Invalid CRL
+
+GPG_ERR_BAD_BER BER error
+
+GPG_ERR_INV_BER Invalid BER
+
+GPG_ERR_ELEMENT_NOT_FOUND Element not found
+
+GPG_ERR_IDENTIFIER_NOT_FOUND Identifier not found
+
+GPG_ERR_INV_TAG Invalid tag
+
+GPG_ERR_INV_LENGTH Invalid length
+
+ GCRYPT: - Bad block length for certain cipher algorithms and
+ modes.
+ - Bad length of input data; e.g. not a multiple of the
+ block length.
+ - A length does not match the size of the digest
+ algorithm.
+ - Length of signature or public key is not as expected
+ (e.g. in EdDSA).
+ [more to come]
+ GNUPG: - Invalid hash length for a pubkey
+ [more to come]
+
+GPG_ERR_INV_KEYINFO Invalid key info
+
+ KSBA: - Returned if the ASN.1 Keyinfo structure is not valid
+
+GPG_ERR_UNEXPECTED_TAG Unexpected tag
+
+GPG_ERR_NOT_DER_ENCODED Not DER encoded
+
+GPG_ERR_NO_CMS_OBJ No CMS object
+
+GPG_ERR_INV_CMS_OBJ Invalid CMS object
+
+GPG_ERR_UNKNOWN_CMS_OBJ Unknown CMS object
+
+GPG_ERR_UNSUPPORTED_CMS_OBJ Unsupported CMS object
+
+GPG_ERR_UNSUPPORTED_ENCODING Unsupported encoding
+
+ GNUPG: - Returned by Dirmngr if a keyserver returns a HTML document.
+
+
+GPG_ERR_UNSUPPORTED_CMS_VERSION Unsupported CMS version
+
+
+GPG_ERR_UNKNOWN_ALGORITHM Unknown algorithm
+
+ GCRYPT: gcry_kdf_proc for an unknown kdf algorithm
+
+GPG_ERR_INV_ENGINE Invalid crypto engine
+
+ GPGME: Several uses use cases. For example:
+ - Unexpected format of a status line.
+
+GPG_ERR_PUBKEY_NOT_TRUSTED Public key not trusted
+GPG_ERR_DECRYPT_FAILED Decryption failed
+GPG_ERR_KEY_EXPIRED Key expired
+GPG_ERR_SIG_EXPIRED Signature expired
+GPG_ERR_ENCODING_PROBLEM Encoding problem
+
+GPG_ERR_INV_STATE Invalid state
+
+ The state (of a protocol) is not possible or not defined at all.
+
+ NTBTLS: - Data received in an unexpected state.
+ - A function is called while not being in the right state.
+
+
+GPG_ERR_DUP_VALUE Duplicated value
+
+GPG_ERR_MISSING_ACTION Missing action
+
+ GNUPG: - In G13 the server command "MOUNT" is used without prior
+ use of the command "OPEN".
+
+ others: - The libassuan ce-server test program uses this to
+ indicate that the client did not connect to the server
+ as requested.
+
+GPG_ERR_MODULE_NOT_FOUND ASN.1 module not found
+
+GPG_ERR_INV_OID_STRING Invalid OID string
+
+GPG_ERR_INV_TIME Invalid time
+
+GPG_ERR_INV_CRL_OBJ Invalid CRL object
+
+GPG_ERR_UNSUPPORTED_CRL_VERSION Unsupported CRL version
+
+
+GPG_ERR_INV_CERT_OBJ Invalid certificate object
+
+ GPGME: - A bad certificate (gpgme_key_t) has been passed to a
+ function. For example it might be incomplete due to a
+ missing fingerprint.
+
+
+GPG_ERR_UNKNOWN_NAME Unknown name
+
+ Used by GPG to indicate an unknown ECC curve name (may also
+ indicate missing ECC support). It is also used to indicate an
+ unsuported parameter name in functions which take a name and
+ value to update state. Note that GPG_ERR_UNKNOWN_CURVE is
+ used instead by newer code.
+
+GPG_ERR_LOCALE_PROBLEM A locale function failed
+
+GPG_ERR_NOT_LOCKED Not locked
+
+GPG_ERR_PROTOCOL_VIOLATION Protocol violation
+
+ GNUPG: - Used for invalid HTTP responses.
+
+
+GPG_ERR_INV_MAC Invalid MAC
+
+ The length, algo, or other properties of a MAC are not met.
+ See also GPG_ERR_BAD_MAC.
+
+
+GPG_ERR_INV_REQUEST Invalid request
+
+GPG_ERR_UNKNOWN_EXTN Unknown extension
+
+GPG_ERR_UNKNOWN_CRIT_EXTN Unknown critical extension
+
+GPG_ERR_LOCKED Locked
+
+GPG_ERR_UNKNOWN_OPTION Unknown option
+
+GPG_ERR_UNKNOWN_COMMAND Unknown command
+
+GPG_ERR_NOT_OPERATIONAL Not operational
+
+GPG_ERR_NO_PASSPHRASE No passphrase given
+
+GPG_ERR_NO_PIN No PIN given
+
+GPG_ERR_NOT_ENABLED Not enabled
+
+ Similar to GPG_ERR_NOT_SUPPORTED. In general this error is
+ used for disabled features which can be expected to be enabled
+ by the user.
+
+
+GPG_ERR_NO_ENGINE No crypto engine
+
+GPG_ERR_MISSING_KEY Missing key
+
+ GNUPG: - gpg-agent returns this error on import or export if a key
+ wrapping transport key has not been specified.
+ - It is used when the name "Key" is not found while looking
+ up name value pairs of the extended private key format
+
+ GCRYPT: - A key has not been set when calling a symmetric
+ encryption function.
+
+GPG_ERR_TOO_MANY Too many objects
+
+ GPG: - Dirmngr KS_GET called with too many pattern so that the
+ maximum Assuan line length would overflow.
+ - gpgsm's command export --secret called with too man keys.
+ GPGME: - To many patterns in gpgme-tools's KEYLIST command.
+
+GPG_ERR_LIMIT_REACHED Limit reached
+
+ A programmed limit has been reached.
+
+ GnuPG: gpgtar: Extract directory can't be created because too
+ many of directories with a similar name are already existing.
+
+GPG_ERR_NOT_INITIALIZED Not initialized
+
+ An operation can't be performed because something has not been
+ initialized. This might be a missing initialization of an entire
+ subsystems or a prerequisite for using a function is not
+ fulfilled.
+
+GPG_ERR_MISSING_ISSUER_CERT Missing issuer certificate
+
+GPG_ERR_NO_KEYSERVER No keyserver available
+
+ No keyserver configured or no keyserver available due to
+ missing support for the requested protocol. Found in Dirmngr.
+
+GPG_ERR_INV_CURVE Invalid elliptic curve
+
+ The curve parameter is missing or the curve is invalid; for
+ example it is not possible to get affine coordinates for the
+ public key.
+
+GPG_ERR_UNKNOWN_CURVE Unknown elliptic curve
+
+ The curve is not known or not supported by the protocol.
+
+
+GPG_ERR_DUP_KEY Duplicated key
+
+ A duplicated key was detected. For example a unique key in a
+ database occurred more than once. Also used if in a protocol
+ an expected key was returned more than once.
+
+GPG_ERR_AMBIGUOUS Ambiguous search
+
+ A search etc returned an ambigious result. This usually means
+ that the search string was not specific enough.
+
+GPG_ERR_NO_CRYPT_CTX No crypto context
+
+ A crypto context was expected but not given. Commonly used by
+ Libgcrypt.
+
+GPG_ERR_WRONG_CRYPT_CTX Wrong crypto context
+
+ The given crypto context does not match the requirements. For
+ example in Libgcrypt a crypto context has private data
+ pertaining to certain algorithms. This error is for example
+ returned if a crypto context initialized for a different
+ algorithm is used.
+
+GPG_ERR_BAD_CRYPT_CTX Bad crypto context
+
+ The is a problem with the crypto context. For example it has
+ not been properly initialized.
+
+GPG_ERR_CRYPT_CTX_CONFLICT Conflict in the crypto context
+
+ Conflicting use of a crypto context. For example if a context
+ is used with objects that don't match the state of the
+ context.
+
+GPG_ERR_BROKEN_PUBKEY Broken public key
+
+ The public key was mathematically not correctly generated.
+ (It would have been nicer if we would have used BAD_PUBKEY for
+ this, but that error code is in long time use to describe for
+ example policy and encoding problems with a key. Using
+ INV_PUBKEY would have been better for these purposes)
+
+GPG_ERR_BROKEN_SECKEY Broken secret key
+
+ The secret key was mathematically not correctly generated.
+
+GPG_ERR_MAC_ALGO
+
+ GCRYPT: - MAC key algorithm is not defined or not available.
+
+
+GPG_ERR_FULLY_CANCELED Operation fully cancelled
+
+GPG_ERR_UNFINISHED Operation not yet finished
+
+GPG_ERR_BUFFER_TOO_SHORT Buffer too short
+
+GPG_ERR_SEXP_INV_LEN_SPEC Invalid length specifier in S-expression
+
+GPG_ERR_SEXP_STRING_TOO_LONG String too long in S-expression
+
+GPG_ERR_SEXP_UNMATCHED_PAREN Unmatched parentheses in S-expression
+
+GPG_ERR_SEXP_NOT_CANONICAL S-expression not canonical
+
+GPG_ERR_SEXP_BAD_CHARACTER Bad character in S-expression
+
+GPG_ERR_SEXP_BAD_QUOTATION Bad quotation in S-expression
+
+GPG_ERR_SEXP_ZERO_PREFIX Zero prefix in S-expression
+
+GPG_ERR_SEXP_NESTED_DH Nested display hints in S-expression
+
+GPG_ERR_SEXP_UNMATCHED_DH Unmatched display hints
+
+GPG_ERR_SEXP_UNEXPECTED_PUNC Unexpected reserved punctuation in S-expression
+
+GPG_ERR_SEXP_BAD_HEX_CHAR Bad hexadecimal character in S-expression
+
+GPG_ERR_SEXP_ODD_HEX_NUMBERS Odd hexadecimal numbers in S-expression
+
+GPG_ERR_SEXP_BAD_OCT_CHAR Bad octal character in S-expression
+
+GPG_ERR_SUBKEYS_EXP_REV All subkeys are expired or revoked
+
+GPG_ERR_DB_CORRUPTED Database is corrupted
+
+GPG_ERR_SERVER_FAILED Server indicated a failure
+
+GPG_ERR_NO_NAME No name
+
+ EAI_NONAME may be mapped to this code.
+
+GPG_ERR_NO_KEY No key
+
+ Some kind of key was not found.
+
+GPG_ERR_LEGACY_KEY Legacy key
+
+ Used by GnuPG to identify version 2 and 3 OpenPGP key packets.
+
+GPG_ERR_REQUEST_TOO_SHORT Request too short
+
+ A received request is too short to continue processing.
+
+GPG_ERR_REQUEST_TOO_LONG Request too long
+
+ A received request is too long to continue processing. This may
+ be due to an internal limitation, a protocol violation, or due to
+ the use of a newer version of a protocol.
+
+GPG_ERR_OBJ_TERM_STATE Object is in termination state
+
+ For cards this is the ISO status word 0x6285 (file is in
+ termination state).
+
+GPG_ERR_NO_CERT_CHAIN No certificate chain
+
+ NTBTLS: - A CA chain has not been set but is required.
+
+GPG_ERR_CERT_TOO_LARGE Certificate is too large
+
+ NTBTLS: - A certificate is too large to be used by the protocol.
+
+GPG_ERR_INV_RECORD Invalid record
+
+ NTBTLS: - An invalid record was received
+
+GPG_ERR_BAD_MAC The MAC does not verify
+
+ NTBTLS: - MAC verification of the message failed.
+
+GPG_ERR_UNEXPECTED_MSG Unexpected message
+
+ GNUPG: - An unexpected WKS message was received.
+ NTBTLS: - Unexpected message received.
+
+GPG_ERR_COMPR_FAILED Compression or decompression failed
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_WOULD_WRAP A counter would wrap
+
+ NTBTLS: - Too many messages exchanged
+ Other: - A counter would wrap.
+
+GPG_ERR_FATAL_ALERT Fatal alert message received
+
+ NTBTLS: - Fatal alert message received from the peer.
+
+GPG_ERR_NO_CIPHER No cipher algorithm
+
+ NTBTLS: - Server and client have no algo in common
+
+GPG_ERR_MISSING_CLIENT_CERT Missing client certificate
+
+ NTBTLS: - No certificate received from client.
+
+GPG_ERR_CLOSE_NOTIFY Close notification received
+
+ NTBTLS: - Alert with a close notification received
+
+GPG_ERR_TICKET_EXPIRED Ticket expired
+
+ NTBTLS: - Session ticket has expired.
+
+GPG_ERR_BAD_TICKET Bad ticket
+
+ NTBTLS: - Bad new session ticket message.
+
+GPG_ERR_UNKNOWN_IDENTITY Unknown identity
+
+ NTBTLS: - Unknown PSK identify received
+
+GPG_ERR_BAD_HS_CERT Bad certificate message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_CERT_REQ Bad certificate request message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_CERT_VER Bad certificate verify message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_CHANGE_CIPHER Bad change cipher message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_CLIENT_HELLO Bad client hello message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_SERVER_HELLO Bad server hello message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_SERVER_HELLO_DONE Bad server hello done message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_FINISHED Bad finished message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_SERVER_KEX Bad server key exchange message in handshake
+
+ NTBTLS: - As the description says.
+
+GPG_ERR_BAD_HS_CLIENT_KEX Bad client key exchange message in handshake
+
+ NTBTLS: - As the description says.
+
+
+GPG_ERR_BOGUS_STRING Bogus string
+
+ Used if a protocol sends length prefixed strings which contain a
+ Nul byte and further processing would discard the rest of the
+ string. May also be used if a string contains unexpected and
+ possible dangerous characters (e.g. control characters in a domain
+ name).
+
+GPG_ERR_FORBIDDEN Forbidden
+
+ The use of a features is not allowed due to insufficient rights.
+ Use by gpg-agent as an error codes for restricted commands.
+
+GPG_ERR_KEY_DISABLED Key disabled
+
+ GNUPG: - The key has been disabled by the user.
+
+GPG_ERR_KEY_ON_CARD Not possible with a card based key
+
+ GNUPG: - The gpg-agent returns this if a DELETE_KEY commands is
+ used for a smartcard based key.
+
+GPG_ERR_INV_LOCK_OBJ Invalid lock object
+
+ GPGRT: - The provided lock object is not valid. This indicates an
+ internal problem in libgpg-error or more likely a
+ programming error.
+
+GPG_ERR_TRUE True
+
+ Used to return the boolean value True. Note that GPG_ERR_NO_ERROR
+ (with the value 0) is also often used to indicate the value true.
+
+GPG_ERR_FALSE False
+
+ Used to return the boolean value False.
+
+
+GPG_ERR_ASS_GENERAL General IPC error
+
+GPG_ERR_ASS_ACCEPT_FAILED IPC accept call failed
+
+GPG_ERR_ASS_CONNECT_FAILED IPC connect call failed
+
+GPG_ERR_ASS_INV_RESPONSE Invalid IPC response
+
+GPG_ERR_ASS_INV_VALUE Invalid value passed to IPC
+
+GPG_ERR_ASS_INCOMPLETE_LINE Incomplete line passed to IPC
+
+GPG_ERR_ASS_LINE_TOO_LONG Line passed to IPC too long
+
+GPG_ERR_ASS_NESTED_COMMANDS Nested IPC commands
+
+GPG_ERR_ASS_NO_DATA_CB No data callback in IPC
+
+GPG_ERR_ASS_NO_INQUIRE_CB No inquire callback in IPC
+
+GPG_ERR_ASS_NOT_A_SERVER Not an IPC server
+
+GPG_ERR_ASS_NOT_A_CLIENT Not an IPC client
+
+GPG_ERR_ASS_SERVER_START Problem starting IPC server
+
+GPG_ERR_ASS_READ_ERROR IPC read error
+
+GPG_ERR_ASS_WRITE_ERROR IPC write error
+
+GPG_ERR_ASS_TOO_MUCH_DATA Too much data for IPC layer
+
+GPG_ERR_ASS_UNEXPECTED_CMD Unexpected IPC command
+
+GPG_ERR_ASS_UNKNOWN_CMD Unknown IPC command
+
+GPG_ERR_ASS_SYNTAX IPC syntax error
+
+GPG_ERR_ASS_CANCELED IPC call has been cancelled
+
+GPG_ERR_ASS_NO_INPUT No input source for IPC
+
+GPG_ERR_ASS_NO_OUTPUT No output source for IPC
+
+GPG_ERR_ASS_PARAMETER IPC parameter error
+
+GPG_ERR_ASS_UNKNOWN_INQUIRE Unknown IPC inquire
+
+GPG_ERR_ENGINE_TOO_OLD Crypto engine too old
+
+GPG_ERR_WINDOW_TOO_SMALL Screen or window too small
+
+ Pinentry: - The size of the screen is too small.
+
+GPG_ERR_WINDOW_TOO_LARGE Screen or window too large
+
+GPG_ERR_MISSING_ENVVAR Required environment variable not set
+
+ Pinentry: - The size of the screen can't be determined.
+
+GPG_ERR_USER_ID_EXISTS User ID already exists
+
+ GNUPG: - Existing user ID in --quick-gen-key.
+
+GPG_ERR_NAME_EXISTS Name already exists
+
+GPG_ERR_DUP_NAME Duplicated name
+
+GPG_ERR_TOO_YOUNG Objects is too young
+
+ For example used if a file is younger than expected.
+
+GPG_ERR_TOO_OLD Objects is too old
+
+ Used if an object is too old to be used. This is a more generic
+ code than GPG_ERR_ENGINE_TOO_OLD or GPG_ERR_CRL_TOO_OLD.
+
+GPG_ERR_UNKNOWN_FLAG Unknown flag
+
+ The flag is not known.
+
+ GNUPG: - The flag part of the string given to the
+ option --default-new-key-algo value is not known.
+
+GPG_ERR_INV_ORDER Invalid execution order
+
+ GNUPG: - In Dirmngr used for the libdns error code DNS_EORDER.
+
+GPG_ERR_ALREADY_FETCHED Already fetched
+
+ GNUPG: - In Dirmngr used for the libdns error code DNS_EFETCHED.
+
+GPG_ERR_TRY_LATER Try again later
+
+ This indicates that a server asked to try again later; thus it is
+ different from EAGAIN which is used by the local system. This
+ code is for example used instead of h_error's TRY_AGAIN.
+
+GPG_ERR_WRONG_NAME Wrong name
+
+ NTBTLS: - Hostname does not match the certificate
+
+GPG_ERR_SYSTEM_BUG System bug detected
+
+ The underlying operating system misbehaved. For example it wrote
+ more to a buffer than the told maximum size.
+
+
+GPG_ERR_DNS_UNKNOWN Unknown DNS error
+
+ Used by Dirmngr for DNS errors from libdns (DNS_EUNKNOWN);
+
+GPG_ERR_DNS_SECTION Invalid DNS section
+
+ Used by Dirmngr for DNS errors from libdns (DNS_ESECTION);
+
+GPG_ERR_DNS_ADDRESS Invalid textual address form
+
+ Used by Dirmngr for DNS errors from libdns (DNS_EADDRESS);
+
+GPG_ERR_DNS_NO_QUERY Missing DNS query packet
+
+ Used by Dirmngr for DNS errors from libdns (DNS_ENOQUERY);
+
+GPG_ERR_DNS_NO_ANSWER Missing DNS answer packet
+
+ Used by Dirmngr for DNS errors from libdns (DNS_ENOANSWER);
+
+GPG_ERR_DNS_CLOSED Connection closed in DNS
+
+ Used by Dirmngr for DNS errors from libdns (DNS_ECONNFIN);
+
+GPG_ERR_DNS_VERIFY Verification failed in DNS
+
+ Used by Dirmngr for DNS errors from libdns (DNS_EVERIFY);
+
+GPG_ERR_DNS_TIMEOUT DNS Timeout
+
+ A DNS query timed out
+
+GPG_ERR_LDAP_GENERAL LDAP General error
+
+ Catch all error for LDAP. Use when an error code could not be
+ mapped to a gpg-error code.
+
+GPG_ERR_LDAP_ATTR_GENERAL LDAP General attribute error
+GPG_ERR_LDAP_NAME_GENERAL LDAP General name error
+GPG_ERR_LDAP_SECURITY_GENERAL LDAP General security error
+GPG_ERR_LDAP_SERVICE_GENERAL LDAP General service error
+GPG_ERR_LDAP_UPDATE_GENERAL LDAP General update error
+GPG_ERR_LDAP_E_GENERAL LDAP Experimental error code
+GPG_ERR_LDAP_X_GENERAL LDAP Private error code
+GPG_ERR_LDAP_OTHER_GENERAL LDAP Other general error
+
+ The 8 GPG_ERR_LDAP_*_GENERAL error codes may be used to map ranges
+ of LDAP errors to one specific code. OpenLDAP uses LDAP_xxx_RANGE(n)
+ macros for that mapping. "Other general error" may be used similar
+ to "General error" for mapping of ranges. Here are macros from
+ OpenLDAP for reference:
+
+ #define LDAP_ATTR_ERROR(n) LDAP_RANGE((n),0x10,0x15) /* 16-21 */
+ #define LDAP_NAME_ERROR(n) LDAP_RANGE((n),0x20,0x24) /* 32-34,36 */
+ #define LDAP_SECURITY_ERROR(n) LDAP_RANGE((n),0x2F,0x32) /* 47-50 */
+ #define LDAP_SERVICE_ERROR(n) LDAP_RANGE((n),0x33,0x36) /* 51-54 */
+ #define LDAP_UPDATE_ERROR(n) LDAP_RANGE((n),0x40,0x47) /* 64-69,71 */
+ #define LDAP_E_ERROR(n) LDAP_RANGE((n),0x1000,0x3FFF)
+ #define LDAP_X_ERROR(n) LDAP_RANGE((n),0x4000,0xFFFF)
+
+## end of errorref.txt
diff --git a/doc/gpgrt.info b/doc/gpgrt.info
new file mode 100644
index 0000000..350955f
--- /dev/null
+++ b/doc/gpgrt.info
@@ -0,0 +1,1262 @@
+This is gpgrt.info, produced by makeinfo version 6.3 from gpgrt.texi.
+
+This manual is for Libgpg-error (version 1.27, 17 January 2017), which
+is a library for code used by all GnuPG related packages.
+
+Copyright (C) 2014 g10 Code GmbH
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. The text of the
+ license can be found in the section entitled "GNU General Public
+ License".
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* libgpg-error: (gnupg). Error codes and common code for GnuPG.
+END-INFO-DIR-ENTRY
+
+
+File: gpgrt.info, Node: Top, Next: Introduction, Up: (dir)
+
+The Libgpg-error Library
+************************
+
+This manual is for Libgpg-error (version 1.27, 17 January 2017), which
+is a library for code used by all GnuPG related packages.
+
+Copyright (C) 2014 g10 Code GmbH
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. The text of the
+ license can be found in the section entitled "GNU General Public
+ License".
+
+* Menu:
+
+* Introduction:: What is Libgpg-error.
+* Preparation:: What you should do before using the library.
+* Generalities:: General library functions and data types.
+* Tools:: Utility tools
+
+Appendices
+
+* Library Copying:: The GNU Lesser General Public License
+ says how you can copy and share Libgpg-error.
+* Copying:: The GNU General Public License says how you
+ can copy and share some parts of Libgpg-error.
+
+Indices
+
+* Concept Index:: Index of concepts and programs.
+* Function and Data Index:: Index of functions, variables and data types.
+
+
+File: gpgrt.info, Node: Introduction, Next: Preparation, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+Libgpg-error is a library to provide error codes for GnuPG and relates
+software as well as some other general purpose functions. It is planned
+to eventually rename this library to "gpgrt" (for GnuPG RunTime).
+
+* Menu:
+
+* Getting Started:: How to use this manual.
+* Features:: A glance at Libgpg-error’s features.
+* Overview:: Overview about the library.
+
+
+File: gpgrt.info, Node: Getting Started, Next: Features, Up: Introduction
+
+1.1 Getting Started
+===================
+
+This manual documents the Libgpg-error library application programming
+interface (API). The goal is to that all functions and data types
+provided by the library are explained. However, for now this is only a
+stub and not very useful.
+
+
+File: gpgrt.info, Node: Features, Next: Overview, Prev: Getting Started, Up: Introduction
+
+1.2 Features
+============
+
+TBD
+
+
+File: gpgrt.info, Node: Overview, Prev: Features, Up: Introduction
+
+1.3 Overview
+============
+
+The Libgpg-error library is fully thread-safe, where it makes sense to
+be thread-safe.
+
+ TBD
+
+
+File: gpgrt.info, Node: Preparation, Next: Generalities, Prev: Introduction, Up: Top
+
+2 Preparation
+*************
+
+To use Libgpg-error, you have to perform some changes to your sources
+and the build system. The necessary changes are small and explained in
+the following sections. At the end of this chapter, it is described how
+the library is initialized, and how the requirements of the library are
+verified.
+
+* Menu:
+
+* Header:: What header file you need to include.
+* Building sources:: How to build sources using the library.
+* Building sources using Automake:: How to build sources with the help of Automake.
+* Initializing the library:: How to initialize the library.
+* Multi-Threading:: How Libgpg-error can be used in a MT environment.
+
+
+File: gpgrt.info, Node: Header, Next: Building sources, Up: Preparation
+
+2.1 Header
+==========
+
+All interfaces (data types and functions) of the library are defined in
+the header file 'libgpg-error.h'. You must include this in all source
+files using the library, either directly or through some other header
+file, like this:
+
+ #include <libgpg-error.h>
+
+ Note well that the header file is platform specific and may only be
+used on the platform for which it has been build.
+
+ The name space of Libgpg-error is 'gpg_*' and 'gpgrt*' for function
+and type names and 'GPG_*' and 'GPGRT_*' for other symbols. In addition
+the same name prefixes with one prepended underscore are reserved for
+internal use and should never be used by an application.
+
+Certain parts of gpg-error.h may be included by defining these macros:
+
+'GPG_ERR_ENABLE_GETTEXT_MACROS'
+ Define to provide macros to map the internal gettext API to
+ standard names. This has only an effect on Windows platforms.
+
+'GPGRT_ENABLE_ES_MACROS'
+ Define to provide "es_" macros for the estream functions.
+
+
+File: gpgrt.info, Node: Building sources, Next: Building sources using Automake, Prev: Header, Up: Preparation
+
+2.2 Building sources
+====================
+
+If you want to compile a source file including the 'gpg-error.h' header
+file, you must make sure that the compiler can find it in the directory
+hierarchy. This is accomplished by adding the path to the directory in
+which the header file is located to the compilers include file search
+path (via the '-I' option).
+
+ However, the path to the include file is determined at the time the
+source is configured. To solve this problem, Libgpg-error ships with a
+small helper program 'gpg-error-config' that knows the path to the
+include file and other configuration options. The options that need to
+be added to the compiler invocation at compile time are output by the
+'--cflags' option to 'gpg-error-config'. The following example shows
+how it can be used at the command line:
+
+ gcc -c foo.c $(gpg-error-config --cflags)
+
+ Adding the output of 'gpg-error-config --cflags' to the compiler’s
+command line will ensure that the compiler can find the Libgpg-error
+header file.
+
+ A similar problem occurs when linking the program with the library.
+Again, the compiler has to find the library files. For this to work,
+the path to the library files has to be added to the library search path
+(via the '-L' option). For this, the option '--libs' to
+'gpg-error-config' can be used. The example shows how to link 'foo.o'
+with the Libgpg-error library to a program 'foo'.
+
+ gcc -o foo foo.o $(gpg-error-config --libs)
+
+ Of course you can also combine both examples to a single command by
+specifying both options to 'gpg-error-config':
+
+ gcc -o foo foo.c $(gpg-error-config --cflags --libs)
+
+
+File: gpgrt.info, Node: Building sources using Automake, Next: Initializing the library, Prev: Building sources, Up: Preparation
+
+2.3 Building sources using Automake
+===================================
+
+It is much easier if you use GNU Automake instead of writing your own
+Makefiles. If you do that, you do not have to worry about finding and
+invoking the 'gpg-error-config' script at all. Libgpg-error provides an
+extension to Automake that does all the work for you.
+
+ -- Macro: AM_PATH_GPG_ERROR ([MINIMUM-VERSION], [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ Check whether Libgpg-error (at least version MINIMUM-VERSION, if
+ given) exists on the host system. If it is found, execute
+ ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND, if given.
+
+ Additionally, the function defines 'GPG_ERROR_CFLAGS' to the flags
+ needed for compilation of the program to find the 'gpg-error.h'
+ header file, and 'GPG_ERROR_LIBS' to the linker flags needed to
+ link the program to the Libgpg-error library. If the used helper
+ script does not match the target type you are building for a
+ warning is printed and the string 'libgpg-error' is appended to the
+ variable 'gpg_config_script_warn'.
+
+ This macro searches for 'gpg-error-config' along the PATH. If you
+ are cross-compiling, it is useful to set the environment variable
+ 'SYSROOT' to the top directory of your target. The macro will then
+ first look for the helper program in the 'bin' directory below that
+ top directory. An absolute directory name must be used for
+ 'SYSROOT'. Finally, if the configure command line option
+ '--with-libgpg-error-prefix' is used, only its value is used for
+ the top directory below which the helper script is expected.
+
+ You can use the defined Autoconf variables like this in your
+'Makefile.am':
+
+ AM_CPPFLAGS = $(GPG_ERROR_CFLAGS)
+ LDADD = $(GPG_ERROR_LIBS)
+
+
+File: gpgrt.info, Node: Initializing the library, Next: Multi-Threading, Prev: Building sources using Automake, Up: Preparation
+
+2.4 Initializing the library
+============================
+
+Before the library can be used, it should initialize itself. This is
+achieved by invoking the function 'gpgrt_check_version' described below.
+
+ Also, it is often desirable to check that the version of Libgpg-error
+used is indeed one which fits all requirements. Even with binary
+compatibility, new features may have been introduced, but due to problem
+with the dynamic linker an old version may actually be used. So you may
+want to check that the version is okay right after program startup.
+
+ -- Function: const char * gpgrt_check_version (const char *REQ_VERSION)
+
+ The function 'gpgrt_check_version' initializes some subsystems used
+ by Libgpg-error and must be invoked before any other function in
+ the library. *Note Multi-Threading::.
+
+ Furthermore, this function returns the version number of the
+ library. It can also verify that the version number is higher than
+ a certain required version number REQ_VERSION, if this value is not
+ a null pointer.
+
+
+File: gpgrt.info, Node: Multi-Threading, Prev: Initializing the library, Up: Preparation
+
+2.5 Multi-Threading
+===================
+
+TBD.
+
+
+File: gpgrt.info, Node: Generalities, Next: Tools, Prev: Preparation, Up: Top
+
+3 Generalities
+**************
+
+TBD. (Description of the error function may be taken from Libgcrypt.)
+
+
+File: gpgrt.info, Node: Tools, Next: Library Copying, Prev: Generalities, Up: Top
+
+4 Tools
+*******
+
+* Menu:
+
+* gpg-error-config:: Print required compiler flags
+
+
+File: gpgrt.info, Node: gpg-error-config, Up: Tools
+
+4.1 Print required compiler flags
+=================================
+
+'gpg-error-config' is a tool that is used to configure to determine the
+compiler and linker flags that should be used to compile and link
+programs that use Libgpg-error. It is also used internally to the '.m4'
+macros for GNU autoconf that are included with Libgpg-error.
+
+'gpg-error-config' accepts the following options:
+
+'--mt'
+ Provide output appropriate for multithreaded programs. '--mt' is
+ only useful when combined with other options, and must be the first
+ option if present.
+
+'--version'
+ Print the currently installed version of Libgpg-error on the
+ standard output.
+
+'--libs'
+ Print the linker flags that are necessary to link a program using
+ Libgpg-error.
+
+'--cflags'
+ Print the compiler flags that are necessary to compile a program
+ using Libgpg-error.
+
+'--prefix=PREFIX'
+ If specified, use PREFIX instead of the installation prefix that
+ Libgpg-error was built with when computing the output for the
+ '--cflags' and '--libs' options. This option is also used for the
+ exec prefix if '--exec-prefix' was not specified. This option must
+ be specified before any '--libs' or '--cflags' options.
+
+'--exec-prefix=PREFIX'
+ If specified, use PREFIX instead of the installation exec prefix
+ that Libgpg-error was built with when computing the output for the
+ '--cflags' and '--libs' options. This option must be specified
+ before any '--libs' or '--cflags' options.
+
+
+File: gpgrt.info, Node: Library Copying, Next: Copying, Prev: Tools, Up: Top
+
+GNU Lesser General Public License
+*********************************
+
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ [This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence the
+ version number 2.1.]
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public Licenses are
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software--typically libraries--of the Free Software
+Foundation and other authors who decide to use it. You can use it too,
+but we suggest you first think carefully about whether this license or
+the ordinary General Public License is the better strategy to use in any
+particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of it
+in new free programs; and that you are informed that you can do these
+things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling it.
+And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that there
+is no warranty for the free library. Also, if the library is modified
+by someone else and passed on, the recipients should know that what they
+have is not the original version, so that the original author's
+reputation will not be affected by problems that might be introduced by
+others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that any
+patent license obtained for a version of the library must be consistent
+with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and is
+quite different from the ordinary General Public License. We use this
+license for certain libraries in order to permit linking those libraries
+into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the entire
+combination fits its criteria of freedom. The Lesser General Public
+License permits more lax criteria for linking other code with the
+library.
+
+ We call this license the "Lesser" General Public License because it
+does _Less_ to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less of
+an advantage over competing non-free programs. These disadvantages are
+the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it
+becomes a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free library
+does the same job as widely used non-free libraries. In this case,
+there is little to gain by limiting the free library to free software
+only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of free
+software. For example, permission to use the GNU C Library in non-free
+programs enables many more people to use the whole GNU operating system,
+as well as its variant, the GNU/Linux operating system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is linked
+with the Library has the freedom and the wherewithal to run that program
+using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+ program which contains a notice placed by the copyright holder or
+ other authorized party saying it may be distributed under the terms
+ of this Lesser General Public License (also called "this License").
+ Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+ prepared so as to be conveniently linked with application programs
+ (which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+ which has been distributed under these terms. A "work based on the
+ Library" means either the Library or any derivative work under
+ copyright law: that is to say, a work containing the Library or a
+ portion of it, either verbatim or with modifications and/or
+ translated straightforwardly into another language. (Hereinafter,
+ translation is included without limitation in the term
+ "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+ making modifications to it. For a library, complete source code
+ means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the library.
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running a program using the Library is not restricted, and
+ output from such a program is covered only if its contents
+ constitute a work based on the Library (independent of the use of
+ the Library in a tool for writing it). Whether that is true
+ depends on what the Library does and what the program that uses the
+ Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+ complete source code as you receive it, in any medium, provided
+ that you conspicuously and appropriately publish on each copy an
+ appropriate copyright notice and disclaimer of warranty; keep
+ intact all the notices that refer to this License and to the
+ absence of any warranty; and distribute a copy of this License
+ along with the Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 2. You may modify your copy or copies of the Library or any portion of
+ it, thus forming a work based on the Library, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. The modified work must itself be a software library.
+
+ b. You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c. You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d. If a facility in the modified Library refers to a function or
+ a table of data to be supplied by an application program that
+ uses the facility, other than as an argument passed when the
+ facility is invoked, then you must make a good faith effort to
+ ensure that, in the event an application does not supply such
+ function or table, the facility still operates, and performs
+ whatever part of its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots
+ has a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function
+ must be optional: if the application does not supply it, the
+ square root function must still compute square roots.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Library, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not apply
+ to those sections when you distribute them as separate works. But
+ when you distribute the same sections as part of a whole which is a
+ work based on the Library, the distribution of the whole must be on
+ the terms of this License, whose permissions for other licensees
+ extend to the entire whole, and thus to each and every part
+ regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Library.
+
+ In addition, mere aggregation of another work not based on the
+ Library with the Library (or with a work based on the Library) on a
+ volume of a storage or distribution medium does not bring the other
+ work under the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+ License instead of this License to a given copy of the Library. To
+ do this, you must alter all the notices that refer to this License,
+ so that they refer to the ordinary GNU General Public License,
+ version 2, instead of to this License. (If a newer version than
+ version 2 of the ordinary GNU General Public License has appeared,
+ then you can specify that version instead if you wish.) Do not
+ make any other change in these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+ that copy, so the ordinary GNU General Public License applies to
+ all subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of the
+ Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or derivative
+ of it, under Section 2) in object code or executable form under the
+ terms of Sections 1 and 2 above provided that you accompany it with
+ the complete corresponding machine-readable source code, which must
+ be distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+ from a designated place, then offering equivalent access to copy
+ the source code from the same place satisfies the requirement to
+ distribute the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+ Library, but is designed to work with the Library by being compiled
+ or linked with it, is called a "work that uses the Library". Such
+ a work, in isolation, is not a derivative work of the Library, and
+ therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+ creates an executable that is a derivative of the Library (because
+ it contains portions of the Library), rather than a "work that uses
+ the library". The executable is therefore covered by this License.
+ Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header
+ file that is part of the Library, the object code for the work may
+ be a derivative work of the Library even though the source code is
+ not. Whether this is true is especially significant if the work
+ can be linked without the Library, or if the work is itself a
+ library. The threshold for this to be true is not precisely
+ defined by law.
+
+ If such an object file uses only numerical parameters, data
+ structure layouts and accessors, and small macros and small inline
+ functions (ten lines or less in length), then the use of the object
+ file is unrestricted, regardless of whether it is legally a
+ derivative work. (Executables containing this object code plus
+ portions of the Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+ distribute the object code for the work under the terms of Section
+ 6. Any executables containing that work also fall under Section 6,
+ whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or link
+ a "work that uses the Library" with the Library to produce a work
+ containing portions of the Library, and distribute that work under
+ terms of your choice, provided that the terms permit modification
+ of the work for the customer's own use and reverse engineering for
+ debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+ Library is used in it and that the Library and its use are covered
+ by this License. You must supply a copy of this License. If the
+ work during execution displays copyright notices, you must include
+ the copyright notice for the Library among them, as well as a
+ reference directing the user to the copy of this License. Also,
+ you must do one of these things:
+
+ a. Accompany the work with the complete corresponding
+ machine-readable source code for the Library including
+ whatever changes were used in the work (which must be
+ distributed under Sections 1 and 2 above); and, if the work is
+ an executable linked with the Library, with the complete
+ machine-readable "work that uses the Library", as object code
+ and/or source code, so that the user can modify the Library
+ and then relink to produce a modified executable containing
+ the modified Library. (It is understood that the user who
+ changes the contents of definitions files in the Library will
+ not necessarily be able to recompile the application to use
+ the modified definitions.)
+
+ b. Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run
+ time a copy of the library already present on the user's
+ computer system, rather than copying library functions into
+ the executable, and (2) will operate properly with a modified
+ version of the library, if the user installs one, as long as
+ the modified version is interface-compatible with the version
+ that the work was made with.
+
+ c. Accompany the work with a written offer, valid for at least
+ three years, to give the same user the materials specified in
+ Subsection 6a, above, for a charge no more than the cost of
+ performing this distribution.
+
+ d. If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the
+ above specified materials from the same place.
+
+ e. Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+ Library" must include any data and utility programs needed for
+ reproducing the executable from it. However, as a special
+ exception, the materials to be distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of
+ the operating system on which the executable runs, unless that
+ component itself accompanies the executable.
+
+ It may happen that this requirement contradicts the license
+ restrictions of other proprietary libraries that do not normally
+ accompany the operating system. Such a contradiction means you
+ cannot use both them and the Library together in an executable that
+ you distribute.
+
+ 7. You may place library facilities that are a work based on the
+ Library side-by-side in a single library together with other
+ library facilities not covered by this License, and distribute such
+ a combined library, provided that the separate distribution of the
+ work based on the Library and of the other library facilities is
+ otherwise permitted, and provided that you do these two things:
+
+ a. Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b. Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same
+ work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute the
+ Library except as expressly provided under this License. Any
+ attempt otherwise to copy, modify, sublicense, link with, or
+ distribute the Library is void, and will automatically terminate
+ your rights under this License. However, parties who have received
+ copies, or rights, from you under this License will not have their
+ licenses terminated so long as such parties remain in full
+ compliance.
+
+ 9. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Library or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Library (or any work
+ based on the Library), you indicate your acceptance of this License
+ to do so, and all its terms and conditions for copying,
+ distributing or modifying the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+ Library), the recipient automatically receives a license from the
+ original licensor to copy, distribute, link with or modify the
+ Library subject to these terms and conditions. You may not impose
+ any further restrictions on the recipients' exercise of the rights
+ granted herein. You are not responsible for enforcing compliance
+ by third parties with this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Library at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Library by all those who receive
+ copies directly or indirectly through you, then the only way you
+ could satisfy both it and this License would be to refrain entirely
+ from distribution of the Library.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply, and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Library under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+ versions of the Lesser General Public License from time to time.
+ Such new versions will be similar in spirit to the present version,
+ but may differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Library specifies a version number of this License which applies to
+ it and "any later version", you have the option of following the
+ terms and conditions either of that version or of any later version
+ published by the Free Software Foundation. If the Library does not
+ specify a license version number, you may choose any version ever
+ published by the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+ programs whose distribution conditions are incompatible with these,
+ write to the author to ask for permission. For software which is
+ copyrighted by the Free Software Foundation, write to the Free
+ Software Foundation; we sometimes make exceptions for this. Our
+ decision will be guided by the two goals of preserving the free
+ status of all derivatives of our free software and of promoting the
+ sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
+ AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+ PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE
+ DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
+ OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY
+ OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+==============================================
+
+If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of
+the ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library.
+It is safest to attach them to the start of each source file to most
+effectively convey the exclusion of warranty; and each file should have
+at least the "copyright" line and a pointer to where the full notice is
+found.
+
+ ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES.
+ Copyright (C) YEAR NAME OF AUTHOR
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
+ USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the library,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the library
+ `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1990
+ Ty Coon, President of Vice
+
+ That's all there is to it!
+
+
+File: gpgrt.info, Node: Copying, Next: Concept Index, Prev: Library Copying, Up: Top
+
+GNU General Public License
+**************************
+
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+========
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free software--to
+make sure the software is free for all its users. This General Public
+License applies to most of the Free Software Foundation's software and
+to any other program whose authors commit to using it. (Some other Free
+Software Foundation software is covered by the GNU Library General
+Public License instead.) You can apply it to your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it if
+you want it, that you can change the software or use pieces of it in new
+free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 1. This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program",
+ below, refers to any such program or work, and a "work based on the
+ Program" means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or
+ translated into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".) Each
+ licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are
+ not covered by this License; they are outside its scope. The act
+ of running the Program is not restricted, and the output from the
+ Program is covered only if its contents constitute a work based on
+ the Program (independent of having been made by running the
+ Program). Whether that is true depends on what the Program does.
+
+ 2. You may copy and distribute verbatim copies of the Program's source
+ code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any
+ warranty; and give any other recipients of the Program a copy of
+ this License along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy,
+ and you may at your option offer warranty protection in exchange
+ for a fee.
+
+ 3. You may modify your copy or copies of the Program or any portion of
+ it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a. You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b. You must cause any work that you distribute or publish, that
+ in whole or in part contains or is derived from the Program or
+ any part thereof, to be licensed as a whole at no charge to
+ all third parties under the terms of this License.
+
+ c. If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display
+ an announcement including an appropriate copyright notice and
+ a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the
+ program under these conditions, and telling the user how to
+ view a copy of this License. (Exception: if the Program
+ itself is interactive but does not normally print such an
+ announcement, your work based on the Program is not required
+ to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the
+ Program, and can be reasonably considered independent and separate
+ works in themselves, then this License, and its terms, do not apply
+ to those sections when you distribute them as separate works. But
+ when you distribute the same sections as part of a whole which is a
+ work based on the Program, the distribution of the whole must be on
+ the terms of this License, whose permissions for other licensees
+ extend to the entire whole, and thus to each and every part
+ regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or
+ contest your rights to work written entirely by you; rather, the
+ intent is to exercise the right to control the distribution of
+ derivative or collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the
+ Program with the Program (or with a work based on the Program) on a
+ volume of a storage or distribution medium does not bring the other
+ work under the scope of this License.
+
+ 4. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you also do one of the
+ following:
+
+ a. Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ b. Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c. Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete
+ source code means all the source code for all modules it contains,
+ plus any associated interface definition files, plus the scripts
+ used to control compilation and installation of the executable.
+ However, as a special exception, the source code distributed need
+ not include anything that is normally distributed (in either source
+ or binary form) with the major components (compiler, kernel, and so
+ on) of the operating system on which the executable runs, unless
+ that component itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 5. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights,
+ from you under this License will not have their licenses terminated
+ so long as such parties remain in full compliance.
+
+ 6. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify
+ or distribute the Program or its derivative works. These actions
+ are prohibited by law if you do not accept this License.
+ Therefore, by modifying or distributing the Program (or any work
+ based on the Program), you indicate your acceptance of this License
+ to do so, and all its terms and conditions for copying,
+ distributing or modifying the Program or works based on it.
+
+ 7. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject
+ to these terms and conditions. You may not impose any further
+ restrictions on the recipients' exercise of the rights granted
+ herein. You are not responsible for enforcing compliance by third
+ parties to this License.
+
+ 8. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent
+ issues), conditions are imposed on you (whether by court order,
+ agreement or otherwise) that contradict the conditions of this
+ License, they do not excuse you from the conditions of this
+ License. If you cannot distribute so as to satisfy simultaneously
+ your obligations under this License and any other pertinent
+ obligations, then as a consequence you may not distribute the
+ Program at all. For example, if a patent license would not permit
+ royalty-free redistribution of the Program by all those who receive
+ copies directly or indirectly through you, then the only way you
+ could satisfy both it and this License would be to refrain entirely
+ from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable
+ under any particular circumstance, the balance of the section is
+ intended to apply and the section as a whole is intended to apply
+ in other circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of
+ any such claims; this section has the sole purpose of protecting
+ the integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is
+ willing to distribute software through any other system and a
+ licensee cannot impose that choice.
+
+ This section is intended to make thoroughly clear what is believed
+ to be a consequence of the rest of this License.
+
+ 9. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces,
+ the original copyright holder who places the Program under this
+ License may add an explicit geographical distribution limitation
+ excluding those countries, so that distribution is permitted only
+ in or among countries not thus excluded. In such case, this
+ License incorporates the limitation as if written in the body of
+ this License.
+
+ 10. The Free Software Foundation may publish revised and/or new
+ versions of the General Public License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+ Program specifies a version number of this License which applies to
+ it and "any later version", you have the option of following the
+ terms and conditions either of that version or of any later version
+ published by the Free Software Foundation. If the Program does not
+ specify a version number of this License, you may choose any
+ version ever published by the Free Software Foundation.
+
+ 11. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted by
+ the Free Software Foundation, write to the Free Software
+ Foundation; we sometimes make exceptions for this. Our decision
+ will be guided by the two goals of preserving the free status of
+ all derivatives of our free software and of promoting the sharing
+ and reuse of software generally.
+
+ NO WARRANTY
+
+ 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
+ AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+ PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+ DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
+ OR CORRECTION.
+
+ 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+=============================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
+ Copyright (C) 19YY NAME OF AUTHOR
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+ Also add information on how to contact you by electronic and paper
+mail.
+
+ If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+ type `show w'. This is free software, and you are welcome
+ to redistribute it under certain conditions; type `show c'
+ for details.
+
+ The hypothetical commands 'show w' and 'show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than 'show w' and 'show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+ You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright
+ interest in the program `Gnomovision'
+ (which makes passes at compilers) written
+ by James Hacker.
+
+ SIGNATURE OF TY COON, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your
+program into proprietary programs. If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library. If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+
+File: gpgrt.info, Node: Concept Index, Next: Function and Data Index, Prev: Copying, Up: Top
+
+Concept Index
+*************
+
+
+* Menu:
+
+* GPL, GNU General Public License: Copying. (line 6)
+* LGPL, GNU Lesser General Public License: Library Copying. (line 6)
+
+
+File: gpgrt.info, Node: Function and Data Index, Prev: Concept Index, Up: Top
+
+Function and Data Index
+***********************
+
+
+* Menu:
+
+* AM_PATH_GPG_ERROR: Building sources using Automake.
+ (line 11)
+* gpgrt_check_version: Initializing the library.
+ (line 15)
+
+
+
+Tag Table:
+Node: Top729
+Node: Introduction2103
+Node: Getting Started2625
+Node: Features2982
+Node: Overview3111
+Node: Preparation3307
+Node: Header4108
+Node: Building sources5193
+Node: Building sources using Automake6956
+Node: Initializing the library8901
+Node: Multi-Threading10089
+Node: Generalities10231
+Node: Tools10418
+Node: gpg-error-config10588
+Node: Library Copying12167
+Node: Copying40268
+Node: Concept Index59438
+Node: Function and Data Index59735
+
+End Tag Table
diff --git a/doc/gpgrt.texi b/doc/gpgrt.texi
new file mode 100644
index 0000000..857973a
--- /dev/null
+++ b/doc/gpgrt.texi
@@ -0,0 +1,435 @@
+\input texinfo @c -*- Texinfo -*-
+@c %**start of header
+@setfilename gpgrt.info
+@include version.texi
+@settitle The Libgpg-error Reference Manual
+@c Unify some of the indices.
+@syncodeindex tp fn
+@syncodeindex pg fn
+@c %**end of header
+@copying
+This manual is for Libgpg-error (version @value{VERSION},
+@value{UPDATED}), which is a library for code used by all GnuPG
+related packages.
+
+@noindent
+Copyright @copyright{} 2014 g10 Code GmbH
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version. The text of the license can be found in the
+section entitled ``GNU General Public License''.
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* libgpg-error: (gnupg). Error codes and common code for GnuPG.
+@end direntry
+
+@c A couple of macros with no effect on texinfo
+@c but used by the yat2m processor.
+@macro manpage {a}
+@end macro
+@macro mansect {a}
+@end macro
+@macro manpause
+@end macro
+@macro mancont
+@end macro
+
+@c
+@c Printing stuff taken from gcc.
+@c
+@macro gnupgtabopt{body}
+@code{\body\}
+@end macro
+
+
+@c
+@c Titlepage
+@c
+@setchapternewpage odd
+@titlepage
+@title The Libgpg-error Reference Manual
+@subtitle Version @value{VERSION}
+@subtitle @value{UPDATED}
+@author Werner Koch (@email{wk@@gnupg.org})
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnothtml
+@summarycontents
+@contents
+@page
+@end ifnothtml
+
+
+@ifnottex
+@node Top
+@top The Libgpg-error Library
+@insertcopying
+@end ifnottex
+
+
+@menu
+* Introduction:: What is Libgpg-error.
+* Preparation:: What you should do before using the library.
+* Generalities:: General library functions and data types.
+* Tools:: Utility tools
+
+Appendices
+
+* Library Copying:: The GNU Lesser General Public License
+ says how you can copy and share Libgpg-error.
+* Copying:: The GNU General Public License says how you
+ can copy and share some parts of Libgpg-error.
+
+Indices
+
+@c * Figures and Tables:: Index of figures and tables.
+* Concept Index:: Index of concepts and programs.
+* Function and Data Index:: Index of functions, variables and data types.
+
+@end menu
+
+@ifhtml
+@page
+@summarycontents
+@contents
+@end ifhtml
+
+
+@c **********************************************************
+@c ******************* Introduction ***********************
+@c **********************************************************
+@node Introduction
+@chapter Introduction
+
+Libgpg-error is a library to provide error codes for GnuPG and relates
+software as well as some other general purpose functions. It is
+planned to eventually rename this library to ``gpgrt'' (for GnuPG
+RunTime).
+
+@menu
+* Getting Started:: How to use this manual.
+* Features:: A glance at Libgpg-error’s features.
+* Overview:: Overview about the library.
+@end menu
+
+@node Getting Started
+@section Getting Started
+
+This manual documents the Libgpg-error library application programming
+interface (API). The goal is to that all functions and data types
+provided by the library are explained. However, for now this is only
+a stub and not very useful.
+
+
+@node Features
+@section Features
+
+TBD
+
+@node Overview
+@section Overview
+
+@noindent
+The Libgpg-error library is fully thread-safe, where it makes
+sense to be thread-safe.
+
+TBD
+
+@c **********************************************************
+@c ******************* Preparation ************************
+@c **********************************************************
+@node Preparation
+@chapter Preparation
+
+To use Libgpg-error, you have to perform some changes to your
+sources and the build system. The necessary changes are small and
+explained in the following sections. At the end of this chapter, it
+is described how the library is initialized, and how the requirements
+of the library are verified.
+
+@menu
+* Header:: What header file you need to include.
+* Building sources:: How to build sources using the library.
+* Building sources using Automake:: How to build sources with the help of Automake.
+* Initializing the library:: How to initialize the library.
+* Multi-Threading:: How Libgpg-error can be used in a MT environment.
+@end menu
+
+
+@node Header
+@section Header
+
+All interfaces (data types and functions) of the library are defined
+in the header file @file{libgpg-error.h}. You must include this in all source
+files using the library, either directly or through some other header
+file, like this:
+
+@example
+#include <libgpg-error.h>
+@end example
+
+Note well that the header file is platform specific and may only be
+used on the platform for which it has been build.
+
+The name space of Libgpg-error is @code{gpg_*} and @code{gpgrt*}
+for function and type names and @code{GPG_*} and @code{GPGRT_*}
+for other symbols. In addition the same name prefixes with one
+prepended underscore are reserved for internal use and should never be
+used by an application.
+
+@noindent
+Certain parts of gpg-error.h may be included by defining these macros:
+
+@table @code
+@item GPG_ERR_ENABLE_GETTEXT_MACROS
+Define to provide macros to map the internal gettext API to standard
+names. This has only an effect on Windows platforms.
+
+@item GPGRT_ENABLE_ES_MACROS
+Define to provide "es_" macros for the estream functions.
+@end table
+
+@node Building sources
+@section Building sources
+
+If you want to compile a source file including the `gpg-error.h' header
+file, you must make sure that the compiler can find it in the
+directory hierarchy. This is accomplished by adding the path to the
+directory in which the header file is located to the compilers include
+file search path (via the @option{-I} option).
+
+However, the path to the include file is determined at the time the
+source is configured. To solve this problem, Libgpg-error ships with a small
+helper program @command{gpg-error-config} that knows the path to the
+include file and other configuration options. The options that need
+to be added to the compiler invocation at compile time are output by
+the @option{--cflags} option to @command{gpg-error-config}. The following
+example shows how it can be used at the command line:
+
+@example
+gcc -c foo.c $(gpg-error-config --cflags)
+@end example
+
+Adding the output of @samp{gpg-error-config --cflags} to the
+compiler’s command line will ensure that the compiler can find the
+Libgpg-error header file.
+
+A similar problem occurs when linking the program with the library.
+Again, the compiler has to find the library files. For this to work,
+the path to the library files has to be added to the library search
+path (via the @option{-L} option). For this, the option
+@option{--libs} to @command{gpg-error-config} can be used. The
+example shows how to link @file{foo.o} with the Libgpg-error library
+to a program @command{foo}.
+
+@example
+gcc -o foo foo.o $(gpg-error-config --libs)
+@end example
+
+Of course you can also combine both examples to a single command by
+specifying both options to @command{gpg-error-config}:
+
+@example
+gcc -o foo foo.c $(gpg-error-config --cflags --libs)
+@end example
+
+@node Building sources using Automake
+@section Building sources using Automake
+
+It is much easier if you use GNU Automake instead of writing your own
+Makefiles. If you do that, you do not have to worry about finding and
+invoking the @command{gpg-error-config} script at all. Libgpg-error
+provides an extension to Automake that does all the work for you.
+
+@c A simple macro for optional variables.
+@macro ovar{varname}
+@r{[}@var{\varname\}@r{]}
+@end macro
+@defmac AM_PATH_GPG_ERROR (@ovar{minimum-version}, @ovar{action-if-found}, @ovar{action-if-not-found})
+Check whether Libgpg-error (at least version @var{minimum-version}, if
+given) exists on the host system. If it is found, execute
+@var{action-if-found}, otherwise do @var{action-if-not-found}, if
+given.
+
+Additionally, the function defines @code{GPG_ERROR_CFLAGS} to the
+flags needed for compilation of the program to find the
+@file{gpg-error.h} header file, and @code{GPG_ERROR_LIBS} to the
+linker flags needed to link the program to the Libgpg-error library. If
+the used helper script does not match the target type you are building
+for a warning is printed and the string @code{libgpg-error} is
+appended to the variable @code{gpg_config_script_warn}.
+
+This macro searches for @command{gpg-error-config} along the PATH. If
+you are cross-compiling, it is useful to set the environment variable
+@code{SYSROOT} to the top directory of your target. The macro will
+then first look for the helper program in the @file{bin} directory
+below that top directory. An absolute directory name must be used for
+@code{SYSROOT}. Finally, if the configure command line option
+@code{--with-libgpg-error-prefix} is used, only its value is used for
+the top directory below which the helper script is expected.
+
+@end defmac
+
+You can use the defined Autoconf variables like this in your
+@file{Makefile.am}:
+
+@example
+AM_CPPFLAGS = $(GPG_ERROR_CFLAGS)
+LDADD = $(GPG_ERROR_LIBS)
+@end example
+
+@node Initializing the library
+@section Initializing the library
+
+Before the library can be used, it should initialize itself. This is
+achieved by invoking the function @code{gpgrt_check_version} described
+below.
+
+Also, it is often desirable to check that the version of
+Libgpg-error used is indeed one which fits all requirements.
+Even with binary compatibility, new features may have been introduced,
+but due to problem with the dynamic linker an old version may actually
+be used. So you may want to check that the version is okay right
+after program startup.
+
+@deftypefun {const char *} gpgrt_check_version (const char *@var{req_version})
+
+The function @code{gpgrt_check_version} initializes some subsystems used
+by Libgpg-error and must be invoked before any other function in the
+library.
+@xref{Multi-Threading}.
+
+Furthermore, this function returns the version number of the library.
+It can also verify that the version number is higher than a certain
+required version number @var{req_version}, if this value is not a null
+pointer.
+@end deftypefun
+
+
+@node Multi-Threading
+@section Multi-Threading
+
+TBD.
+
+@c **********************************************************
+@c ******************* General ****************************
+@c **********************************************************
+@node Generalities
+@chapter Generalities
+
+TBD. (Description of the error function may be taken from Libgcrypt.)
+
+
+
+@c **********************************************************
+@c ********************* Tools ****************************
+@c **********************************************************
+@node Tools
+@chapter Tools
+
+@menu
+* gpg-error-config:: Print required compiler flags
+@end menu
+
+@c The original version of this man page has been written for Debian and was
+@c contributed to libgpg-error by Daniel Kahn Gillmor <dkg@fifthhorseman.net>.
+@manpage gpg-error-config.1
+@node gpg-error-config
+@section Print required compiler flags
+@ifset manverb
+.B gpg-error-config
+\- Script to get information about the installed version of libgpg-error
+@end ifset
+
+@mansect synopsis
+@ifset manverb
+.B gpg-error-config
+.RI [ options ]
+@end ifset
+
+@mansect description
+@command{gpg-error-config} is a tool that is used to configure to
+determine the compiler and linker flags that should be used to compile
+and link programs that use Libgpg-error. It is also used
+internally to the @code{.m4} macros for GNU autoconf that are included
+with Libgpg-error.
+
+@mansect options
+@noindent
+@command{gpg-error-config} accepts the following options:
+
+@table @gnupgtabopt
+
+@item --mt
+Provide output appropriate for multithreaded programs. @option{--mt}
+is only useful when combined with other options, and must be the first
+option if present.
+
+@item --version
+Print the currently installed version of Libgpg-error on the
+standard output.
+
+@item --libs
+Print the linker flags that are necessary to link a program using
+Libgpg-error.
+
+@item --cflags
+Print the compiler flags that are necessary to compile a program using
+Libgpg-error.
+
+@item --prefix=@var{prefix}
+If specified, use @var{prefix} instead of the installation prefix that
+Libgpg-error was built with when computing the output for the
+@option{--cflags} and @option{--libs} options. This option is also
+used for the exec prefix if @option{--exec-prefix} was not specified.
+This option must be specified before any @option{--libs} or
+@code{--cflags} options.
+
+@item --exec-prefix=@var{prefix}
+If specified, use @var{prefix} instead of the installation exec prefix
+that Libgpg-error was built with when computing the output for the
+@option{--cflags} and @option{--libs} options. This option must be
+specified before any @option{--libs} or @option{--cflags} options.
+
+@end table
+
+@manpause
+
+
+
+@c **********************************************************
+@c ************* Appendices (license etc.) ****************
+@c **********************************************************
+@include lgpl.texi
+
+@include gpl.texi
+
+@c @node Figures and Tables
+@c #@unnumbered List of Figures and Tables
+@c
+@c @listoffloats Figure
+@c
+@c @listoffloats Table
+
+@node Concept Index
+@unnumbered Concept Index
+
+@printindex cp
+
+@node Function and Data Index
+@unnumbered Function and Data Index
+
+@printindex fn
+
+
+@bye
diff --git a/doc/gpl.texi b/doc/gpl.texi
new file mode 100644
index 0000000..6eb301e
--- /dev/null
+++ b/doc/gpl.texi
@@ -0,0 +1,392 @@
+@node Copying
+@unnumbered GNU General Public License
+
+@cindex GPL, GNU General Public License
+@center Version 2, June 1991
+
+@display
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+@iftex
+@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end iftex
+@ifinfo
+@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end ifinfo
+
+@enumerate
+@item
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The ``Program'', below,
+refers to any such program or work, and a ``work based on the Program''
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term ``modification''.) Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+@item
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+@item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+@item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+@enumerate a
+@item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+@item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+@item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+@end enumerate
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+@item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+@item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+@center NO WARRANTY
+
+@item
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+@end ifinfo
+
+@page
+@heading How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and an idea of what it does.}
+Copyright (C) 19@var{yy} @var{name of author}
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+@smallexample
+Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than @samp{show w} and
+@samp{show c}; they could even be mouse-clicks or menu items---whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. Here is a sample; alter the names:
+
+@smallexample
+@group
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+@var{signature of Ty Coon}, 1 April 1989
+Ty Coon, President of Vice
+@end group
+@end smallexample
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/doc/lgpl.texi b/doc/lgpl.texi
new file mode 100644
index 0000000..bbd18a0
--- /dev/null
+++ b/doc/lgpl.texi
@@ -0,0 +1,560 @@
+@node Library Copying
+@unnumbered GNU Lesser General Public License
+
+@cindex LGPL, GNU Lesser General Public License
+@center Version 2.1, February 1999
+
+@display
+Copyright @copyright{} 1991, 1999 Free Software Foundation, Inc.
+59 Temple Place -- Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+as the successor of the GNU Library Public License, version 2, hence the
+version number 2.1.]
+@end display
+
+@heading Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software---to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software---typically libraries---of the Free
+Software Foundation and other authors who decide to use it. You can use
+it too, but we suggest you first think carefully about whether this
+license or the ordinary General Public License is the better strategy to
+use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of it
+in new free programs; and that you are informed that you can do these
+things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the @dfn{Lesser} General Public License because it
+does @emph{Less} to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+``work based on the library'' and a ``work that uses the library''. The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+@iftex
+@heading TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end iftex
+@ifinfo
+@center GNU LESSER GENERAL PUBLIC LICENSE
+@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end ifinfo
+
+@enumerate 0
+@item
+This License Agreement applies to any software library or other program
+which contains a notice placed by the copyright holder or other
+authorized party saying it may be distributed under the terms of this
+Lesser General Public License (also called ``this License''). Each
+licensee is addressed as ``you''.
+
+ A ``library'' means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The ``Library'', below, refers to any such software library or work
+which has been distributed under these terms. A ``work based on the
+Library'' means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term ``modification''.)
+
+ ``Source code'' for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+@item
+You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+@item
+You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+The modified work must itself be a software library.
+
+@item
+You must cause the files modified to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause the whole of the work to be licensed at no
+charge to all third parties under the terms of this License.
+
+@item
+If a facility in the modified Library refers to a function or a
+table of data to be supplied by an application program that uses
+the facility, other than as an argument passed when the facility
+is invoked, then you must make a good faith effort to ensure that,
+in the event an application does not supply such function or
+table, the facility still operates, and performs whatever part of
+its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has
+a purpose that is entirely well-defined independent of the
+application. Therefore, Subsection 2d requires that any
+application-supplied function or table used by this function must
+be optional: if the application does not supply it, the square
+root function must still compute square roots.)
+@end enumerate
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+@item
+You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a ``work that uses the Library''. Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a ``work that uses the Library'' with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a ``work that uses the
+library''. The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a ``work that uses the Library'' uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+@item
+As an exception to the Sections above, you may also combine or
+link a ``work that uses the Library'' with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+@enumerate a
+@item
+Accompany the work with the complete corresponding
+machine-readable source code for the Library including whatever
+changes were used in the work (which must be distributed under
+Sections 1 and 2 above); and, if the work is an executable linked
+with the Library, with the complete machine-readable ``work that
+uses the Library'', as object code and/or source code, so that the
+user can modify the Library and then relink to produce a modified
+executable containing the modified Library. (It is understood
+that the user who changes the contents of definitions files in the
+Library will not necessarily be able to recompile the application
+to use the modified definitions.)
+
+@item
+Use a suitable shared library mechanism for linking with the Library. A
+suitable mechanism is one that (1) uses at run time a copy of the
+library already present on the user's computer system, rather than
+copying library functions into the executable, and (2) will operate
+properly with a modified version of the library, if the user installs
+one, as long as the modified version is interface-compatible with the
+version that the work was made with.
+
+@item
+Accompany the work with a written offer, valid for at
+least three years, to give the same user the materials
+specified in Subsection 6a, above, for a charge no more
+than the cost of performing this distribution.
+
+@item
+If distribution of the work is made by offering access to copy
+from a designated place, offer equivalent access to copy the above
+specified materials from the same place.
+
+@item
+Verify that the user has already received a copy of these
+materials or that you have already sent this user a copy.
+@end enumerate
+
+ For an executable, the required form of the ``work that uses the
+Library'' must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies the
+executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+@item
+You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+@enumerate a
+@item
+Accompany the combined library with a copy of the same work
+based on the Library, uncombined with any other library
+facilities. This must be distributed under the terms of the
+Sections above.
+
+@item
+Give prominent notice with the combined library of the fact
+that part of it is a work based on the Library, and explaining
+where to find the accompanying uncombined form of the same work.
+@end enumerate
+
+@item
+You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+@item
+Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+``any later version'', you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+@item
+If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+@center NO WARRANTY
+
+@item
+BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY ``AS IS'' WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+@end ifinfo
+
+@page
+@heading How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the library's name and an idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at
+your option) any later version.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
+USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the library, if
+necessary. Here is a sample; alter the names:
+
+@smallexample
+Yoyodyne, Inc., hereby disclaims all copyright interest in the library
+`Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+@var{signature of Ty Coon}, 1 April 1990
+Ty Coon, President of Vice
+@end smallexample
+
+That's all there is to it!
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..6e2ad60
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 17 January 2017
+@set UPDATED-MONTH January 2017
+@set EDITION 1.27
+@set VERSION 1.27
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..6e2ad60
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 17 January 2017
+@set UPDATED-MONTH January 2017
+@set EDITION 1.27
+@set VERSION 1.27
diff --git a/doc/yat2m.c b/doc/yat2m.c
new file mode 100644
index 0000000..9b76f19
--- /dev/null
+++ b/doc/yat2m.c
@@ -0,0 +1,1633 @@
+/* yat2m.c - Yet Another Texi 2 Man converter
+ * Copyright (C) 2005, 2013, 2015, 2016 g10 Code GmbH
+ * Copyright (C) 2006, 2008, 2011 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 <https://www.gnu.org/licenses/>.
+ */
+
+/*
+ This is a simple texinfo to man page converter. It needs some
+ special markup in th e texinfo and tries best to get a create man
+ page. It has been designed for the GnuPG man pages and thus only
+ a few texinfo commands are supported.
+
+ To use this you need to add the following macros into your texinfo
+ source:
+
+ @macro manpage {a}
+ @end macro
+ @macro mansect {a}
+ @end macro
+ @macro manpause
+ @end macro
+ @macro mancont
+ @end macro
+
+ They are used by yat2m to select parts of the Texinfo which should
+ go into the man page. These macros need to be used without leading
+ left space. Processing starts after a "manpage" macro has been
+ seen. "mansect" identifies the section and yat2m make sure to
+ emit the sections in the proper order. Note that @mansect skips
+ the next input line if that line begins with @section, @subsection or
+ @chapheading.
+
+ To insert verbatim troff markup, the following texinfo code may be
+ used:
+
+ @ifset manverb
+ .B whateever you want
+ @end ifset
+
+ alternativly a special comment may be used:
+
+ @c man:.B whatever you want
+
+ This is useful in case you need just one line. If you want to
+ include parts only in the man page but keep the texinfo
+ translation you may use:
+
+ @ifset isman
+ stuff to be rendered only on man pages
+ @end ifset
+
+ or to exclude stuff from man pages:
+
+ @ifclear isman
+ stuff not to be rendered on man pages
+ @end ifclear
+
+ the keyword @section is ignored, however @subsection gets rendered
+ as ".SS". @menu is completely skipped. Several man pages may be
+ extracted from one file, either using the --store or the --select
+ option.
+
+ If you want to indent tables in the source use this style:
+
+ @table foo
+ @item
+ @item
+ @table
+ @item
+ @end
+ @end
+
+ Don't change the indentation within a table and keep the same
+ number of white space at the start of the line. yat2m simply
+ detects the number of white spaces in front of an @item and remove
+ this number of spaces from all following lines until a new @item
+ is found or there are less spaces than for the last @item.
+
+ Note that @* does only work correctly if used at the end of an
+ input line.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+#include <time.h>
+
+
+#if __GNUC__
+# define MY_GCC_VERSION (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+#else
+# define MY_GCC_VERSION 0
+#endif
+
+#if MY_GCC_VERSION >= 20500
+# define ATTR_PRINTF(f, a) __attribute__ ((format(printf,f,a)))
+# define ATTR_NR_PRINTF(f, a) __attribute__ ((noreturn, format(printf,f,a)))
+#else
+# define ATTR_PRINTF(f, a)
+# define ATTR_NR_PRINTF(f, a)
+#endif
+#if MY_GCC_VERSION >= 30200
+# define ATTR_MALLOC __attribute__ ((__malloc__))
+#else
+# define ATTR_MALLOC
+#endif
+
+
+
+#define PGM "yat2m"
+#define VERSION "1.0"
+
+/* The maximum length of a line including the linefeed and one extra
+ character. */
+#define LINESIZE 1024
+
+/* Number of allowed condition nestings. */
+#define MAX_CONDITION_NESTING 10
+
+/* Option flags. */
+static int verbose;
+static int quiet;
+static int debug;
+static const char *opt_source;
+static const char *opt_release;
+static const char *opt_date;
+static const char *opt_select;
+static const char *opt_include;
+static int opt_store;
+
+/* Flag to keep track whether any error occurred. */
+static int any_error;
+
+
+/* Object to keep macro definitions. */
+struct macro_s
+{
+ struct macro_s *next;
+ char *value; /* Malloced value. */
+ char name[1];
+};
+typedef struct macro_s *macro_t;
+
+/* List of all defined macros. */
+static macro_t macrolist;
+
+/* List of variables set by @set. */
+static macro_t variablelist;
+
+/* List of global macro names. The value part is not used. */
+static macro_t predefinedmacrolist;
+
+/* Object to keep track of @isset and @ifclear. */
+struct condition_s
+{
+ int manverb; /* "manverb" needs special treatment. */
+ int isset; /* This is an @isset condition. */
+ char name[1]; /* Name of the condition macro. */
+};
+typedef struct condition_s *condition_t;
+
+/* The stack used to evaluate conditions. And the current states. */
+static condition_t condition_stack[MAX_CONDITION_NESTING];
+static int condition_stack_idx;
+static int cond_is_active; /* State of ifset/ifclear */
+static int cond_in_verbatim; /* State of "manverb". */
+
+
+/* Object to store one line of content. */
+struct line_buffer_s
+{
+ struct line_buffer_s *next;
+ int verbatim; /* True if LINE contains verbatim data. The default
+ is Texinfo source. */
+ char *line;
+};
+typedef struct line_buffer_s *line_buffer_t;
+
+
+/* Object to collect the data of a section. */
+struct section_buffer_s
+{
+ char *name; /* Malloced name of the section. This may be
+ NULL to indicate this slot is not used. */
+ line_buffer_t lines; /* Linked list with the lines of the section. */
+ line_buffer_t *lines_tail; /* Helper for faster appending to the
+ linked list. */
+ line_buffer_t last_line; /* Points to the last line appended. */
+};
+typedef struct section_buffer_s *section_buffer_t;
+
+/* Variable to keep info about the current page together. */
+static struct
+{
+ /* Filename of the current page or NULL if no page is active. Malloced. */
+ char *name;
+
+ /* Number of allocated elements in SECTIONS below. */
+ size_t n_sections;
+ /* Array with the data of the sections. */
+ section_buffer_t sections;
+
+} thepage;
+
+
+/* The list of standard section names. COMMANDS and ASSUAN are GnuPG
+ specific. */
+static const char * const standard_sections[] =
+ { "NAME", "SYNOPSIS", "DESCRIPTION",
+ "RETURN VALUE", "EXIT STATUS", "ERROR HANDLING", "ERRORS",
+ "COMMANDS", "OPTIONS", "USAGE", "EXAMPLES", "FILES",
+ "ENVIRONMENT", "DIAGNOSTICS", "SECURITY", "CONFORMING TO",
+ "ASSUAN", "NOTES", "BUGS", "AUTHOR", "SEE ALSO", NULL };
+
+
+/*-- Local prototypes. --*/
+static void proc_texi_buffer (FILE *fp, const char *line, size_t len,
+ int *table_level, int *eol_action);
+
+static void die (const char *format, ...) ATTR_NR_PRINTF(1,2);
+static void err (const char *format, ...) ATTR_PRINTF(1,2);
+static void inf (const char *format, ...) ATTR_PRINTF(1,2);
+static void *xmalloc (size_t n) ATTR_MALLOC;
+static void *xcalloc (size_t n, size_t m) ATTR_MALLOC;
+
+
+
+/*-- Functions --*/
+
+/* Print diagnostic message and exit with failure. */
+static void
+die (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ fflush (stdout);
+ fprintf (stderr, "%s: ", PGM);
+
+ va_start (arg_ptr, format);
+ vfprintf (stderr, format, arg_ptr);
+ va_end (arg_ptr);
+ putc ('\n', stderr);
+
+ exit (1);
+}
+
+
+/* Print diagnostic message. */
+static void
+err (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ fflush (stdout);
+ if (strncmp (format, "%s:%d:", 6))
+ fprintf (stderr, "%s: ", PGM);
+
+ va_start (arg_ptr, format);
+ vfprintf (stderr, format, arg_ptr);
+ va_end (arg_ptr);
+ putc ('\n', stderr);
+ any_error = 1;
+}
+
+/* Print diagnostic message. */
+static void
+inf (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ fflush (stdout);
+ fprintf (stderr, "%s: ", PGM);
+
+ va_start (arg_ptr, format);
+ vfprintf (stderr, format, arg_ptr);
+ va_end (arg_ptr);
+ putc ('\n', stderr);
+}
+
+
+static void *
+xmalloc (size_t n)
+{
+ void *p = malloc (n);
+ if (!p)
+ die ("out of core: %s", strerror (errno));
+ return p;
+}
+
+static void *
+xcalloc (size_t n, size_t m)
+{
+ void *p = calloc (n, m);
+ if (!p)
+ die ("out of core: %s", strerror (errno));
+ return p;
+}
+
+static void *
+xrealloc (void *old, size_t n)
+{
+ void *p = realloc (old, n);
+ if (!p)
+ die ("out of core: %s", strerror (errno));
+ return p;
+}
+
+static char *
+xstrdup (const char *string)
+{
+ void *p = malloc (strlen (string)+1);
+ if (!p)
+ die ("out of core: %s", strerror (errno));
+ strcpy (p, string);
+ return p;
+}
+
+
+/* Uppercase the ascii characters in STRING. */
+static char *
+ascii_strupr (char *string)
+{
+ char *p;
+
+ for (p = string; *p; p++)
+ if (!(*p & 0x80))
+ *p = toupper (*p);
+ return string;
+}
+
+
+/* Return the current date as an ISO string. */
+const char *
+isodatestring (void)
+{
+ static char buffer[11+5];
+ struct tm *tp;
+ time_t atime;
+
+ if (opt_date && *opt_date)
+ atime = strtoul (opt_date, NULL, 10);
+ else
+ atime = time (NULL);
+ if (atime < 0)
+ strcpy (buffer, "????" "-??" "-??");
+ else
+ {
+ tp = gmtime (&atime);
+ sprintf (buffer,"%04d-%02d-%02d",
+ 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+ }
+ return buffer;
+}
+
+
+/* Add NAME to the list of predefined macros which are global for all
+ files. */
+static void
+add_predefined_macro (const char *name)
+{
+ macro_t m;
+
+ for (m=predefinedmacrolist; m; m = m->next)
+ if (!strcmp (m->name, name))
+ break;
+ if (!m)
+ {
+ m = xcalloc (1, sizeof *m + strlen (name));
+ strcpy (m->name, name);
+ m->next = predefinedmacrolist;
+ predefinedmacrolist = m;
+ }
+}
+
+
+/* Create or update a macro with name MACRONAME and set its values TO
+ MACROVALUE. Note that ownership of the macro value is transferred
+ to this function. */
+static void
+set_macro (const char *macroname, char *macrovalue)
+{
+ macro_t m;
+
+ for (m=macrolist; m; m = m->next)
+ if (!strcmp (m->name, macroname))
+ break;
+ if (m)
+ free (m->value);
+ else
+ {
+ m = xcalloc (1, sizeof *m + strlen (macroname));
+ strcpy (m->name, macroname);
+ m->next = macrolist;
+ macrolist = m;
+ }
+ m->value = macrovalue;
+ macrovalue = NULL;
+}
+
+
+/* Create or update a variable with name and value given in NAMEANDVALUE. */
+static void
+set_variable (char *nameandvalue)
+{
+ macro_t m;
+ const char *value;
+ char *p;
+
+ for (p = nameandvalue; *p && *p != ' ' && *p != '\t'; p++)
+ ;
+ if (!*p)
+ value = "";
+ else
+ {
+ *p++ = 0;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ value = p;
+ }
+
+ for (m=variablelist; m; m = m->next)
+ if (!strcmp (m->name, nameandvalue))
+ break;
+ if (m)
+ free (m->value);
+ else
+ {
+ m = xcalloc (1, sizeof *m + strlen (nameandvalue));
+ strcpy (m->name, nameandvalue);
+ m->next = variablelist;
+ variablelist = m;
+ }
+ m->value = xstrdup (value);
+}
+
+
+/* Return true if the macro or variable NAME is set, i.e. not the
+ empty string and not evaluating to 0. */
+static int
+macro_set_p (const char *name)
+{
+ macro_t m;
+
+ for (m = macrolist; m ; m = m->next)
+ if (!strcmp (m->name, name))
+ break;
+ if (!m)
+ for (m = variablelist; m ; m = m->next)
+ if (!strcmp (m->name, name))
+ break;
+ if (!m || !m->value || !*m->value)
+ return 0;
+ if ((*m->value & 0x80) || !isdigit (*m->value))
+ return 1; /* Not a digit but some other string. */
+ return !!atoi (m->value);
+}
+
+
+/* Evaluate the current conditions. */
+static void
+evaluate_conditions (const char *fname, int lnr)
+{
+ int i;
+
+ /* for (i=0; i < condition_stack_idx; i++) */
+ /* inf ("%s:%d: stack[%d] %s %s %c", */
+ /* fname, lnr, i, condition_stack[i]->isset? "set":"clr", */
+ /* condition_stack[i]->name, */
+ /* (macro_set_p (condition_stack[i]->name) */
+ /* ^ !condition_stack[i]->isset)? 't':'f'); */
+
+ cond_is_active = 1;
+ cond_in_verbatim = 0;
+ if (condition_stack_idx)
+ {
+ for (i=0; i < condition_stack_idx; i++)
+ {
+ if (condition_stack[i]->manverb)
+ cond_in_verbatim = (macro_set_p (condition_stack[i]->name)
+ ^ !condition_stack[i]->isset);
+ else if (!(macro_set_p (condition_stack[i]->name)
+ ^ !condition_stack[i]->isset))
+ {
+ cond_is_active = 0;
+ break;
+ }
+ }
+ }
+
+ /* inf ("%s:%d: active=%d verbatim=%d", */
+ /* fname, lnr, cond_is_active, cond_in_verbatim); */
+}
+
+
+/* Push a condition with condition macro NAME onto the stack. If
+ ISSET is true, a @isset condition is pushed. */
+static void
+push_condition (const char *name, int isset, const char *fname, int lnr)
+{
+ condition_t cond;
+ int manverb = 0;
+
+ if (condition_stack_idx >= MAX_CONDITION_NESTING)
+ {
+ err ("%s:%d: condition nested too deep", fname, lnr);
+ return;
+ }
+
+ if (!strcmp (name, "manverb"))
+ {
+ if (!isset)
+ {
+ err ("%s:%d: using \"@ifclear manverb\" is not allowed", fname, lnr);
+ return;
+ }
+ manverb = 1;
+ }
+
+ cond = xcalloc (1, sizeof *cond + strlen (name));
+ cond->manverb = manverb;
+ cond->isset = isset;
+ strcpy (cond->name, name);
+
+ condition_stack[condition_stack_idx++] = cond;
+ evaluate_conditions (fname, lnr);
+}
+
+
+/* Remove the last condition from the stack. ISSET is used for error
+ reporting. */
+static void
+pop_condition (int isset, const char *fname, int lnr)
+{
+ if (!condition_stack_idx)
+ {
+ err ("%s:%d: unbalanced \"@end %s\"",
+ fname, lnr, isset?"isset":"isclear");
+ return;
+ }
+ condition_stack_idx--;
+ free (condition_stack[condition_stack_idx]);
+ condition_stack[condition_stack_idx] = NULL;
+ evaluate_conditions (fname, lnr);
+}
+
+
+
+/* Return a section buffer for the section NAME. Allocate a new buffer
+ if this is a new section. Keep track of the sections in THEPAGE.
+ This function may reallocate the section array in THEPAGE. */
+static section_buffer_t
+get_section_buffer (const char *name)
+{
+ int i;
+ section_buffer_t sect;
+
+ /* If there is no section we put everything into the required NAME
+ section. Given that this is the first one listed it is likely
+ that error are easily visible. */
+ if (!name)
+ name = "NAME";
+
+ for (i=0; i < thepage.n_sections; i++)
+ {
+ sect = thepage.sections + i;
+ if (sect->name && !strcmp (name, sect->name))
+ return sect;
+ }
+ for (i=0; i < thepage.n_sections; i++)
+ if (!thepage.sections[i].name)
+ break;
+ if (thepage.n_sections && i < thepage.n_sections)
+ sect = thepage.sections + i;
+ else
+ {
+ /* We need to allocate or reallocate the section array. */
+ size_t old_n = thepage.n_sections;
+ size_t new_n = 20;
+
+ if (!old_n)
+ thepage.sections = xcalloc (new_n, sizeof *thepage.sections);
+ else
+ {
+ thepage.sections = xrealloc (thepage.sections,
+ ((old_n + new_n)
+ * sizeof *thepage.sections));
+ memset (thepage.sections + old_n, 0,
+ new_n * sizeof *thepage.sections);
+ }
+ thepage.n_sections += new_n;
+
+ /* Setup the tail pointers. */
+ for (i=old_n; i < thepage.n_sections; i++)
+ {
+ sect = thepage.sections + i;
+ sect->lines_tail = &sect->lines;
+ }
+ sect = thepage.sections + old_n;
+ }
+
+ /* Store the name. */
+ assert (!sect->name);
+ sect->name = xstrdup (name);
+ return sect;
+}
+
+
+
+/* Add the content of LINE to the section named SECTNAME. */
+static void
+add_content (const char *sectname, char *line, int verbatim)
+{
+ section_buffer_t sect;
+ line_buffer_t lb;
+
+ sect = get_section_buffer (sectname);
+ if (sect->last_line && !sect->last_line->verbatim == !verbatim)
+ {
+ /* Lets append that line to the last one. We do this to keep
+ all lines of the same kind (i.e.verbatim or not) together in
+ one large buffer. */
+ size_t n1, n;
+
+ lb = sect->last_line;
+ n1 = strlen (lb->line);
+ n = n1 + 1 + strlen (line) + 1;
+ lb->line = xrealloc (lb->line, n);
+ strcpy (lb->line+n1, "\n");
+ strcpy (lb->line+n1+1, line);
+ }
+ else
+ {
+ lb = xcalloc (1, sizeof *lb);
+ lb->verbatim = verbatim;
+ lb->line = xstrdup (line);
+ sect->last_line = lb;
+ *sect->lines_tail = lb;
+ sect->lines_tail = &lb->next;
+ }
+}
+
+
+/* Prepare for a new man page using the filename NAME. */
+static void
+start_page (char *name)
+{
+ if (verbose)
+ inf ("starting page '%s'", name);
+ assert (!thepage.name);
+ thepage.name = xstrdup (name);
+ thepage.n_sections = 0;
+}
+
+
+/* Write the .TH entry of the current page. Return -1 if there is a
+ problem with the page. */
+static int
+write_th (FILE *fp)
+{
+ char *name, *p;
+
+ fputs (".\\\" Created from Texinfo source by yat2m " VERSION "\n", fp);
+
+ name = ascii_strupr (xstrdup (thepage.name));
+ p = strrchr (name, '.');
+ if (!p || !p[1])
+ {
+ err ("no section name in man page '%s'", thepage.name);
+ free (name);
+ return -1;
+ }
+ *p++ = 0;
+ fprintf (fp, ".TH %s %s %s \"%s\" \"%s\"\n",
+ name, p, isodatestring (), opt_release, opt_source);
+ free (name);
+ return 0;
+}
+
+
+/* Process the texinfo command COMMAND (without the leading @) and
+ write output if needed to FP. REST is the remainer of the line
+ which should either point to an opening brace or to a white space.
+ The function returns the number of characters already processed
+ from REST. LEN is the usable length of REST. TABLE_LEVEL is used to
+ control the indentation of tables. */
+static size_t
+proc_texi_cmd (FILE *fp, const char *command, const char *rest, size_t len,
+ int *table_level, int *eol_action)
+{
+ static struct {
+ const char *name; /* Name of the command. */
+ int what; /* What to do with this command. */
+ const char *lead_in; /* String to print with a opening brace. */
+ const char *lead_out;/* String to print with the closing brace. */
+ } cmdtbl[] = {
+ { "command", 0, "\\fB", "\\fR" },
+ { "code", 0, "\\fB", "\\fR" },
+ { "url", 0, "\\fB", "\\fR" },
+ { "sc", 0, "\\fB", "\\fR" },
+ { "var", 0, "\\fI", "\\fR" },
+ { "samp", 0, "\\(aq", "\\(aq" },
+ { "file", 0, "\\(oq\\fI","\\fR\\(cq" },
+ { "env", 0, "\\(oq\\fI","\\fR\\(cq" },
+ { "acronym", 0 },
+ { "dfn", 0 },
+ { "option", 0, "\\fB", "\\fR" },
+ { "example", 1, ".RS 2\n.nf\n" },
+ { "smallexample", 1, ".RS 2\n.nf\n" },
+ { "asis", 7 },
+ { "anchor", 7 },
+ { "cartouche", 1 },
+ { "xref", 0, "see: [", "]" },
+ { "pxref", 0, "see: [", "]" },
+ { "uref", 0, "(\\fB", "\\fR)" },
+ { "footnote",0, " ([", "])" },
+ { "emph", 0, "\\fI", "\\fR" },
+ { "w", 1 },
+ { "c", 5 },
+ { "efindex", 1 },
+ { "opindex", 1 },
+ { "cpindex", 1 },
+ { "cindex", 1 },
+ { "noindent", 0 },
+ { "section", 1 },
+ { "chapter", 1 },
+ { "subsection", 6, "\n.SS " },
+ { "chapheading", 0},
+ { "item", 2, ".TP\n.B " },
+ { "itemx", 2, ".TQ\n.B " },
+ { "table", 3 },
+ { "itemize", 3 },
+ { "bullet", 0, "* " },
+ { "*", 0, "\n.br"},
+ { "/", 0 },
+ { "end", 4 },
+ { "quotation",1, ".RS\n\\fB" },
+ { "value", 8 },
+ { NULL }
+ };
+ size_t n;
+ int i;
+ const char *s;
+ const char *lead_out = NULL;
+ int ignore_args = 0;
+
+ for (i=0; cmdtbl[i].name && strcmp (cmdtbl[i].name, command); i++)
+ ;
+ if (cmdtbl[i].name)
+ {
+ s = cmdtbl[i].lead_in;
+ if (s)
+ fputs (s, fp);
+ lead_out = cmdtbl[i].lead_out;
+ switch (cmdtbl[i].what)
+ {
+ case 1: /* Throw away the entire line. */
+ s = memchr (rest, '\n', len);
+ return s? (s-rest)+1 : len;
+ case 2: /* Handle @item. */
+ break;
+ case 3: /* Handle table. */
+ if (++(*table_level) > 1)
+ fputs (".RS\n", fp);
+ /* Now throw away the entire line. */
+ s = memchr (rest, '\n', len);
+ return s? (s-rest)+1 : len;
+ break;
+ case 4: /* Handle end. */
+ for (s=rest, n=len; n && (*s == ' ' || *s == '\t'); s++, n--)
+ ;
+ if (n >= 5 && !memcmp (s, "table", 5)
+ && (!n || s[5] == ' ' || s[5] == '\t' || s[5] == '\n'))
+ {
+ if ((*table_level)-- > 1)
+ fputs (".RE\n", fp);
+ else
+ fputs (".P\n", fp);
+ }
+ else if (n >= 7 && !memcmp (s, "example", 7)
+ && (!n || s[7] == ' ' || s[7] == '\t' || s[7] == '\n'))
+ {
+ fputs (".fi\n.RE\n", fp);
+ }
+ else if (n >= 12 && !memcmp (s, "smallexample", 12)
+ && (!n || s[12] == ' ' || s[12] == '\t' || s[12] == '\n'))
+ {
+ fputs (".fi\n.RE\n", fp);
+ }
+ else if (n >= 9 && !memcmp (s, "quotation", 9)
+ && (!n || s[9] == ' ' || s[9] == '\t' || s[9] == '\n'))
+ {
+ fputs ("\\fR\n.RE\n", fp);
+ }
+ /* Now throw away the entire line. */
+ s = memchr (rest, '\n', len);
+ return s? (s-rest)+1 : len;
+ case 5: /* Handle special comments. */
+ for (s=rest, n=len; n && (*s == ' ' || *s == '\t'); s++, n--)
+ ;
+ if (n >= 4 && !memcmp (s, "man:", 4))
+ {
+ for (s+=4, n-=4; n && *s != '\n'; n--, s++)
+ putc (*s, fp);
+ putc ('\n', fp);
+ }
+ /* Now throw away the entire line. */
+ s = memchr (rest, '\n', len);
+ return s? (s-rest)+1 : len;
+ case 6:
+ *eol_action = 1;
+ break;
+ case 7:
+ ignore_args = 1;
+ break;
+ case 8:
+ ignore_args = 1;
+ if (*rest != '{')
+ {
+ err ("opening brace for command '%s' missing", command);
+ return len;
+ }
+ else
+ {
+ /* Find closing brace. */
+ for (s=rest+1, n=1; *s && n < len; s++, n++)
+ if (*s == '}')
+ break;
+ if (*s != '}')
+ {
+ err ("closing brace for command '%s' not found", command);
+ return len;
+ }
+ else
+ {
+ size_t len = s - (rest + 1);
+ macro_t m;
+
+ for (m = variablelist; m; m = m->next)
+ if (strlen (m->name) == len
+ &&!strncmp (m->name, rest+1, len))
+ break;
+ if (m)
+ fputs (m->value, fp);
+ else
+ inf ("texinfo variable '%.*s' is not set",
+ (int)len, rest+1);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else /* macro */
+ {
+ macro_t m;
+
+ for (m = macrolist; m ; m = m->next)
+ if (!strcmp (m->name, command))
+ break;
+ if (m)
+ {
+ proc_texi_buffer (fp, m->value, strlen (m->value),
+ table_level, eol_action);
+ ignore_args = 1; /* Parameterized macros are not yet supported. */
+ }
+ else
+ inf ("texinfo command '%s' not supported (%.*s)", command,
+ (int)((s = memchr (rest, '\n', len)), (s? (s-rest) : len)), rest);
+ }
+
+ if (*rest == '{')
+ {
+ /* Find matching closing brace. */
+ for (s=rest+1, n=1, i=1; i && *s && n < len; s++, n++)
+ if (*s == '{')
+ i++;
+ else if (*s == '}')
+ i--;
+ if (i)
+ {
+ err ("closing brace for command '%s' not found", command);
+ return len;
+ }
+ if (n > 2 && !ignore_args)
+ proc_texi_buffer (fp, rest+1, n-2, table_level, eol_action);
+ }
+ else
+ n = 0;
+
+ if (lead_out)
+ fputs (lead_out, fp);
+
+ return n;
+}
+
+
+
+/* Process the string LINE with LEN bytes of Texinfo content. */
+static void
+proc_texi_buffer (FILE *fp, const char *line, size_t len,
+ int *table_level, int *eol_action)
+{
+ const char *s;
+ char cmdbuf[256];
+ int cmdidx = 0;
+ int in_cmd = 0;
+ size_t n;
+
+ for (s=line; *s && len; s++, len--)
+ {
+ if (in_cmd)
+ {
+ if (in_cmd == 1)
+ {
+ switch (*s)
+ {
+ case '@': case '{': case '}':
+ putc (*s, fp); in_cmd = 0;
+ break;
+ case ':': /* Not ending a sentence flag. */
+ in_cmd = 0;
+ break;
+ case '.': case '!': case '?': /* Ending a sentence. */
+ putc (*s, fp); in_cmd = 0;
+ break;
+ case ' ': case '\t': case '\n': /* Non collapsing spaces. */
+ putc (*s, fp); in_cmd = 0;
+ break;
+ default:
+ cmdidx = 0;
+ cmdbuf[cmdidx++] = *s;
+ in_cmd++;
+ break;
+ }
+ }
+ else if (*s == '{' || *s == ' ' || *s == '\t' || *s == '\n')
+ {
+ cmdbuf[cmdidx] = 0;
+ n = proc_texi_cmd (fp, cmdbuf, s, len, table_level, eol_action);
+ assert (n <= len);
+ s += n; len -= n;
+ s--; len++;
+ in_cmd = 0;
+ }
+ else if (cmdidx < sizeof cmdbuf -1)
+ cmdbuf[cmdidx++] = *s;
+ else
+ {
+ err ("texinfo command too long - ignored");
+ in_cmd = 0;
+ }
+ }
+ else if (*s == '@')
+ in_cmd = 1;
+ else if (*s == '\n')
+ {
+ switch (*eol_action)
+ {
+ case 1: /* Create a dummy paragraph. */
+ fputs ("\n\\ \n", fp);
+ break;
+ default:
+ putc (*s, fp);
+ }
+ *eol_action = 0;
+ }
+ else if (*s == '\\')
+ fputs ("\\\\", fp);
+ else
+ putc (*s, fp);
+ }
+
+ if (in_cmd > 1)
+ {
+ cmdbuf[cmdidx] = 0;
+ n = proc_texi_cmd (fp, cmdbuf, s, len, table_level, eol_action);
+ assert (n <= len);
+ s += n; len -= n;
+ s--; len++;
+ /* in_cmd = 0; -- doc only */
+ }
+}
+
+
+/* Do something with the Texinfo line LINE. */
+static void
+parse_texi_line (FILE *fp, const char *line, int *table_level)
+{
+ int eol_action = 0;
+
+ /* A quick test whether there are any texinfo commands. */
+ if (!strchr (line, '@'))
+ {
+ fputs (line, fp);
+ putc ('\n', fp);
+ return;
+ }
+ proc_texi_buffer (fp, line, strlen (line), table_level, &eol_action);
+ putc ('\n', fp);
+}
+
+
+/* Write all the lines LINES to FP. */
+static void
+write_content (FILE *fp, line_buffer_t lines)
+{
+ line_buffer_t line;
+ int table_level = 0;
+
+ for (line = lines; line; line = line->next)
+ {
+ if (line->verbatim)
+ {
+ fputs (line->line, fp);
+ putc ('\n', fp);
+ }
+ else
+ {
+/* fputs ("TEXI---", fp); */
+/* fputs (line->line, fp); */
+/* fputs ("---\n", fp); */
+ parse_texi_line (fp, line->line, &table_level);
+ }
+ }
+}
+
+
+
+static int
+is_standard_section (const char *name)
+{
+ int i;
+ const char *s;
+
+ for (i=0; (s=standard_sections[i]); i++)
+ if (!strcmp (s, name))
+ return 1;
+ return 0;
+}
+
+
+/* Finish a page; that is sort the data and write it out to the file. */
+static void
+finish_page (void)
+{
+ FILE *fp;
+ section_buffer_t sect = NULL;
+ int idx;
+ const char *s;
+ int i;
+
+ if (!thepage.name)
+ return; /* No page active. */
+
+ if (verbose)
+ inf ("finishing page '%s'", thepage.name);
+
+ if (opt_select)
+ {
+ if (!strcmp (opt_select, thepage.name))
+ {
+ inf ("selected '%s'", thepage.name );
+ fp = stdout;
+ }
+ else
+ {
+ fp = fopen ( "/dev/null", "w" );
+ if (!fp)
+ die ("failed to open /dev/null: %s\n", strerror (errno));
+ }
+ }
+ else if (opt_store)
+ {
+ inf ("writing '%s'", thepage.name );
+ fp = fopen ( thepage.name, "w" );
+ if (!fp)
+ die ("failed to create '%s': %s\n", thepage.name, strerror (errno));
+ }
+ else
+ fp = stdout;
+
+ if (write_th (fp))
+ goto leave;
+
+ for (idx=0; (s=standard_sections[idx]); idx++)
+ {
+ for (i=0; i < thepage.n_sections; i++)
+ {
+ sect = thepage.sections + i;
+ if (sect->name && !strcmp (s, sect->name))
+ break;
+ }
+ if (i == thepage.n_sections)
+ sect = NULL;
+
+ if (sect)
+ {
+ fprintf (fp, ".SH %s\n", sect->name);
+ write_content (fp, sect->lines);
+ /* Now continue with all non standard sections directly
+ following this one. */
+ for (i++; i < thepage.n_sections; i++)
+ {
+ sect = thepage.sections + i;
+ if (sect->name && is_standard_section (sect->name))
+ break;
+ if (sect->name)
+ {
+ fprintf (fp, ".SH %s\n", sect->name);
+ write_content (fp, sect->lines);
+ }
+ }
+
+ }
+ }
+
+
+ leave:
+ if (fp != stdout)
+ fclose (fp);
+ free (thepage.name);
+ thepage.name = NULL;
+ /* FIXME: Cleanup the content. */
+}
+
+
+
+
+/* Parse one Texinfo file and create manpages according to the
+ embedded instructions. */
+static void
+parse_file (const char *fname, FILE *fp, char **section_name, int in_pause)
+{
+ char *line;
+ int lnr = 0;
+ /* Fixme: The following state variables don't carry over to include
+ files. */
+ int skip_to_end = 0; /* Used to skip over menu entries. */
+ int skip_sect_line = 0; /* Skip after @mansect. */
+ int item_indent = 0; /* How far is the current @item indented. */
+
+ /* Helper to define a macro. */
+ char *macroname = NULL;
+ char *macrovalue = NULL;
+ size_t macrovaluesize = 0;
+ size_t macrovalueused = 0;
+
+ line = xmalloc (LINESIZE);
+ while (fgets (line, LINESIZE, fp))
+ {
+ size_t n = strlen (line);
+ int got_line = 0;
+ char *p, *pend;
+
+ lnr++;
+ if (!n || line[n-1] != '\n')
+ {
+ err ("%s:%d: trailing linefeed missing, line too long or "
+ "embedded Nul character", fname, lnr);
+ break;
+ }
+ line[--n] = 0;
+
+ /* Kludge to allow indentation of tables. */
+ for (p=line; *p == ' ' || *p == '\t'; p++)
+ ;
+ if (*p)
+ {
+ if (*p == '@' && !strncmp (p+1, "item", 4))
+ item_indent = p - line; /* Set a new indent level. */
+ else if (p - line < item_indent)
+ item_indent = 0; /* Switch off indention. */
+
+ if (item_indent)
+ {
+ memmove (line, line+item_indent, n - item_indent + 1);
+ n -= item_indent;
+ }
+ }
+
+
+ if (*line == '@')
+ {
+ for (p=line+1, n=1; *p && *p != ' ' && *p != '\t'; p++)
+ n++;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ }
+ else
+ p = line;
+
+ /* Take action on macro. */
+ if (macroname)
+ {
+ if (n == 4 && !memcmp (line, "@end", 4)
+ && (line[4]==' '||line[4]=='\t'||!line[4])
+ && !strncmp (p, "macro", 5)
+ && (p[5]==' '||p[5]=='\t'||!p[5]))
+ {
+ if (macrovalueused)
+ macrovalue[--macrovalueused] = 0; /* Kill the last LF. */
+ macrovalue[macrovalueused] = 0; /* Terminate macro. */
+ macrovalue = xrealloc (macrovalue, macrovalueused+1);
+
+ set_macro (macroname, macrovalue);
+ macrovalue = NULL;
+ free (macroname);
+ macroname = NULL;
+ }
+ else
+ {
+ if (macrovalueused + strlen (line) + 2 >= macrovaluesize)
+ {
+ macrovaluesize += strlen (line) + 256;
+ macrovalue = xrealloc (macrovalue, macrovaluesize);
+ }
+ strcpy (macrovalue+macrovalueused, line);
+ macrovalueused += strlen (line);
+ macrovalue[macrovalueused++] = '\n';
+ }
+ continue;
+ }
+
+
+ if (n >= 5 && !memcmp (line, "@node", 5)
+ && (line[5]==' '||line[5]=='\t'||!line[5]))
+ {
+ /* Completey ignore @node lines. */
+ continue;
+ }
+
+
+ if (skip_sect_line)
+ {
+ skip_sect_line = 0;
+ if (!strncmp (line, "@section", 8)
+ || !strncmp (line, "@subsection", 11)
+ || !strncmp (line, "@chapheading", 12))
+ continue;
+ }
+
+ /* We only parse lines we need and ignore the rest. There are a
+ few macros used to control this as well as one @ifset
+ command. Parts we know about are saved away into containers
+ separate for each section. */
+
+ /* First process ifset/ifclear commands. */
+ if (*line == '@')
+ {
+ if (n == 6 && !memcmp (line, "@ifset", 6)
+ && (line[6]==' '||line[6]=='\t'))
+ {
+ for (p=line+7; *p == ' ' || *p == '\t'; p++)
+ ;
+ if (!*p)
+ {
+ err ("%s:%d: name missing after \"@ifset\"", fname, lnr);
+ continue;
+ }
+ for (pend=p; *pend && *pend != ' ' && *pend != '\t'; pend++)
+ ;
+ *pend = 0; /* Ignore rest of the line. */
+ push_condition (p, 1, fname, lnr);
+ continue;
+ }
+ else if (n == 8 && !memcmp (line, "@ifclear", 8)
+ && (line[8]==' '||line[8]=='\t'))
+ {
+ for (p=line+9; *p == ' ' || *p == '\t'; p++)
+ ;
+ if (!*p)
+ {
+ err ("%s:%d: name missing after \"@ifsclear\"", fname, lnr);
+ continue;
+ }
+ for (pend=p; *pend && *pend != ' ' && *pend != '\t'; pend++)
+ ;
+ *pend = 0; /* Ignore rest of the line. */
+ push_condition (p, 0, fname, lnr);
+ continue;
+ }
+ else if (n == 4 && !memcmp (line, "@end", 4)
+ && (line[4]==' '||line[4]=='\t')
+ && !strncmp (p, "ifset", 5)
+ && (p[5]==' '||p[5]=='\t'||!p[5]))
+ {
+ pop_condition (1, fname, lnr);
+ continue;
+ }
+ else if (n == 4 && !memcmp (line, "@end", 4)
+ && (line[4]==' '||line[4]=='\t')
+ && !strncmp (p, "ifclear", 7)
+ && (p[7]==' '||p[7]=='\t'||!p[7]))
+ {
+ pop_condition (0, fname, lnr);
+ continue;
+ }
+ }
+
+ /* Take action on ifset/ifclear. */
+ if (!cond_is_active)
+ continue;
+
+ /* Process commands. */
+ if (*line == '@')
+ {
+ if (skip_to_end
+ && n == 4 && !memcmp (line, "@end", 4)
+ && (line[4]==' '||line[4]=='\t'||!line[4]))
+ {
+ skip_to_end = 0;
+ }
+ else if (cond_in_verbatim)
+ {
+ got_line = 1;
+ }
+ else if (n == 6 && !memcmp (line, "@macro", 6))
+ {
+ macroname = xstrdup (p);
+ macrovalue = xmalloc ((macrovaluesize = 1024));
+ macrovalueused = 0;
+ }
+ else if (n == 4 && !memcmp (line, "@set", 4))
+ {
+ set_variable (p);
+ }
+ else if (n == 8 && !memcmp (line, "@manpage", 8))
+ {
+ free (*section_name);
+ *section_name = NULL;
+ finish_page ();
+ start_page (p);
+ in_pause = 0;
+ }
+ else if (n == 8 && !memcmp (line, "@mansect", 8))
+ {
+ if (!thepage.name)
+ err ("%s:%d: section outside of a man page", fname, lnr);
+ else
+ {
+ free (*section_name);
+ *section_name = ascii_strupr (xstrdup (p));
+ in_pause = 0;
+ skip_sect_line = 1;
+ }
+ }
+ else if (n == 9 && !memcmp (line, "@manpause", 9))
+ {
+ if (!*section_name)
+ err ("%s:%d: pausing outside of a man section", fname, lnr);
+ else if (in_pause)
+ err ("%s:%d: already pausing", fname, lnr);
+ else
+ in_pause = 1;
+ }
+ else if (n == 8 && !memcmp (line, "@mancont", 8))
+ {
+ if (!*section_name)
+ err ("%s:%d: continue outside of a man section", fname, lnr);
+ else if (!in_pause)
+ err ("%s:%d: continue while not pausing", fname, lnr);
+ else
+ in_pause = 0;
+ }
+ else if (n == 5 && !memcmp (line, "@menu", 5)
+ && (line[5]==' '||line[5]=='\t'||!line[5]))
+ {
+ skip_to_end = 1;
+ }
+ else if (n == 8 && !memcmp (line, "@include", 8)
+ && (line[8]==' '||line[8]=='\t'||!line[8]))
+ {
+ char *incname = xstrdup (p);
+ FILE *incfp = fopen (incname, "r");
+
+ if (!incfp && opt_include && *opt_include && *p != '/')
+ {
+ free (incname);
+ incname = xmalloc (strlen (opt_include) + 1
+ + strlen (p) + 1);
+ strcpy (incname, opt_include);
+ if ( incname[strlen (incname)-1] != '/' )
+ strcat (incname, "/");
+ strcat (incname, p);
+ incfp = fopen (incname, "r");
+ }
+
+ if (!incfp)
+ err ("can't open include file '%s': %s",
+ incname, strerror (errno));
+ else
+ {
+ parse_file (incname, incfp, section_name, in_pause);
+ fclose (incfp);
+ }
+ free (incname);
+ }
+ else if (n == 4 && !memcmp (line, "@bye", 4)
+ && (line[4]==' '||line[4]=='\t'||!line[4]))
+ {
+ break;
+ }
+ else if (!skip_to_end)
+ got_line = 1;
+ }
+ else if (!skip_to_end)
+ got_line = 1;
+
+ if (got_line && cond_in_verbatim)
+ add_content (*section_name, line, 1);
+ else if (got_line && thepage.name && *section_name && !in_pause)
+ add_content (*section_name, line, 0);
+
+ }
+ if (ferror (fp))
+ err ("%s:%d: read error: %s", fname, lnr, strerror (errno));
+ free (macroname);
+ free (macrovalue);
+ free (line);
+}
+
+
+static void
+top_parse_file (const char *fname, FILE *fp)
+{
+ char *section_name = NULL; /* Name of the current section or NULL
+ if not in a section. */
+ macro_t m;
+
+ while (macrolist)
+ {
+ macro_t next = macrolist->next;
+ free (macrolist->value);
+ free (macrolist);
+ macrolist = next;
+ }
+ while (variablelist)
+ {
+ macro_t next = variablelist->next;
+ free (variablelist->value);
+ free (variablelist);
+ variablelist = next;
+ }
+ for (m=predefinedmacrolist; m; m = m->next)
+ set_macro (m->name, xstrdup ("1"));
+ cond_is_active = 1;
+ cond_in_verbatim = 0;
+
+ parse_file (fname, fp, &section_name, 0);
+ free (section_name);
+ finish_page ();
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int last_argc = -1;
+
+ opt_source = "GNU";
+ opt_release = "";
+
+ /* Define default macros. The trick is that these macros are not
+ defined when using the actual texinfo renderer. */
+ add_predefined_macro ("isman");
+ add_predefined_macro ("manverb");
+
+ /* Option parsing. */
+ if (argc)
+ {
+ argc--; argv++;
+ }
+ while (argc && last_argc != argc )
+ {
+ last_argc = argc;
+ if (!strcmp (*argv, "--"))
+ {
+ argc--; argv++;
+ break;
+ }
+ else if (!strcmp (*argv, "--help"))
+ {
+ puts (
+ "Usage: " PGM " [OPTION] [FILE]\n"
+ "Extract man pages from a Texinfo source.\n\n"
+ " --source NAME use NAME as source field\n"
+ " --release STRING use STRING as the release field\n"
+ " --date EPOCH use EPOCH as publication date\n"
+ " --store write output using @manpage name\n"
+ " --select NAME only output pages with @manpage NAME\n"
+ " --verbose enable extra informational output\n"
+ " --debug enable additional debug output\n"
+ " --help display this help and exit\n"
+ " -I DIR also search in include DIR\n"
+ " -D gpgone the only usable define\n\n"
+ "With no FILE, or when FILE is -, read standard input.\n\n"
+ "Report bugs to <bugs@g10code.com>.");
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--version"))
+ {
+ puts (PGM " " VERSION "\n"
+ "Copyright (C) 2005 g10 Code GmbH\n"
+ "This program comes with ABSOLUTELY NO WARRANTY.\n"
+ "This is free software, and you are welcome to redistribute it\n"
+ "under certain conditions. See the file COPYING for details.");
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--verbose"))
+ {
+ verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--quiet"))
+ {
+ quiet = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--debug"))
+ {
+ verbose = debug = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--source"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ opt_source = *argv;
+ argc--; argv++;
+ }
+ }
+ else if (!strcmp (*argv, "--release"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ opt_release = *argv;
+ argc--; argv++;
+ }
+ }
+ else if (!strcmp (*argv, "--date"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ opt_date = *argv;
+ argc--; argv++;
+ }
+ }
+ else if (!strcmp (*argv, "--store"))
+ {
+ opt_store = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--select"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ opt_select = strrchr (*argv, '/');
+ if (opt_select)
+ opt_select++;
+ else
+ opt_select = *argv;
+ argc--; argv++;
+ }
+ }
+ else if (!strcmp (*argv, "-I"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ opt_include = *argv;
+ argc--; argv++;
+ }
+ }
+ else if (!strcmp (*argv, "-D"))
+ {
+ argc--; argv++;
+ if (argc)
+ {
+ add_predefined_macro (*argv);
+ argc--; argv++;
+ }
+ }
+ }
+
+ if (argc > 1)
+ die ("usage: " PGM " [OPTION] [FILE] (try --help for more information)\n");
+
+ /* Start processing. */
+ if (argc && strcmp (*argv, "-"))
+ {
+ FILE *fp = fopen (*argv, "rb");
+ if (!fp)
+ die ("%s:0: can't open file: %s", *argv, strerror (errno));
+ top_parse_file (*argv, fp);
+ fclose (fp);
+ }
+ else
+ top_parse_file ("-", stdin);
+
+ return !!any_error;
+}
+
+
+/*
+Local Variables:
+compile-command: "gcc -Wall -g -Wall -o yat2m yat2m.c"
+End:
+*/
diff --git a/lang/Makefile.in b/lang/Makefile.in
index 3410ca2..b5e278c 100644
--- a/lang/Makefile.in
+++ b/lang/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -34,23 +33,51 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
esac; \
- test $$am__dry = yes; \
- }
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -70,38 +97,46 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = lang
-DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
+am__v_at_1 =
SOURCES =
DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
- html-recursive info-recursive install-data-recursive \
- install-dvi-recursive install-exec-recursive \
- install-html-recursive install-info-recursive \
- install-pdf-recursive install-ps-recursive install-recursive \
- installcheck-recursive installdirs-recursive pdf-recursive \
- ps-recursive uninstall-recursive
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -109,9 +144,29 @@ am__can_run_installinfo = \
esac
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
- $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
@@ -153,6 +208,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -200,6 +256,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -336,22 +393,25 @@ clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
@@ -366,57 +426,12 @@ $(RECURSIVE_TARGETS):
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
-$(RECURSIVE_CLEAN_TARGETS):
- @fail= failcom='exit 1'; \
- for f in x $$MAKEFLAGS; do \
- case $$f in \
- *=* | --[!k]*);; \
- *k*) failcom='fail=yes';; \
- esac; \
- done; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || eval $$failcom; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-ctags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
- done
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
@@ -432,12 +447,7 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -449,15 +459,11 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -466,6 +472,21 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -626,22 +647,20 @@ ps-am:
uninstall-am:
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
- install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
- all all-am check check-am clean clean-generic clean-libtool \
- ctags ctags-recursive distclean distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am html \
- html-am info info-am install install-am install-data \
- install-data-am install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-man install-pdf install-pdf-am \
- install-ps install-ps-am install-strip installcheck \
- installcheck-am installdirs installdirs-am maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
- uninstall uninstall-am
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/lang/cl/Makefile.in b/lang/cl/Makefile.in
index ad8a882..7a47337 100644
--- a/lang/cl/Makefile.in
+++ b/lang/cl/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -35,23 +34,51 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
- test $$am__dry = yes; \
- }
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -71,30 +98,37 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = lang/cl
-DIST_COMMON = README $(dist_clfiles_DATA) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/gpg-error.asd.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(srcdir)/gpg-error.asd.in $(dist_clfiles_DATA) README
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = gpg-error.asd
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
+am__v_at_1 =
SOURCES =
DIST_SOURCES =
am__can_run_installinfo = \
@@ -131,6 +165,7 @@ am__uninstall_files_from_dir = { \
}
am__installdirs = "$(DESTDIR)$(clfilesdir)" "$(DESTDIR)$(clfilesdir)"
DATA = $(dist_clfiles_DATA) $(nodist_clfiles_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -144,6 +179,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -191,6 +227,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -381,11 +418,11 @@ uninstall-nodist_clfilesDATA:
@list='$(nodist_clfiles_DATA)'; test -n "$(clfilesdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(clfilesdir)'; $(am__uninstall_files_from_dir)
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
distdir: $(DISTFILES)
@@ -525,17 +562,19 @@ uninstall-am: uninstall-dist_clfilesDATA uninstall-nodist_clfilesDATA
.MAKE: install-am install-strip
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dist_clfilesDATA \
- install-dvi install-dvi-am install-exec install-exec-am \
- install-html install-html-am install-info install-info-am \
- install-man install-nodist_clfilesDATA install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am \
+ install-dist_clfilesDATA install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man \
+ install-nodist_clfilesDATA install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
- uninstall-dist_clfilesDATA uninstall-nodist_clfilesDATA
+ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+ uninstall-am uninstall-dist_clfilesDATA \
+ uninstall-nodist_clfilesDATA
gpg-error-codes.lisp: Makefile mkerrcodes.awk $(codes_file) $(errno_file)
diff --git a/lang/cl/gpg-error.asd b/lang/cl/gpg-error.asd
index 46e77fe..a745581 100644
--- a/lang/cl/gpg-error.asd
+++ b/lang/cl/gpg-error.asd
@@ -27,7 +27,7 @@
(defsystem gpg-error
:description "Common error values for all GnuPG components."
:author "g10 Code GmbH"
- :version "1.13"
+ :version "1.27"
:licence "LGPL"
:depends-on ("cffi")
:components ((:file "gpg-error-package")
diff --git a/libgpg-error.spec b/libgpg-error.spec
index cfbeb07..41178bf 100644
--- a/libgpg-error.spec
+++ b/libgpg-error.spec
@@ -1,7 +1,7 @@
# This is a template. The dist target uses it to create the real file.
Summary: libgpg-error
Name: libgpg-error
-Version: 1.13
+Version: 1.27
Release: 1
URL: ftp://ftp.gnupg.org/gcrypt/alpha/libgpg-error/
Source: ftp://ftp.gnupg.org/gcrypt/alpha/libgpg-error/%{name}-%{version}.tar.gz
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 9c2b1e2..2f16e46 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -1,3 +1,3 @@
EXTRA_DIST = inttypes-h.m4 lock.m4 visibility.m4 glibc2.m4 intmax.m4 longdouble.m4 longlong.m4 printf-posix.m4 signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 ac_prog_cc_for_build.m4 nls.m4 po.m4 codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4
-EXTRA_DIST += autobuild.m4
+EXTRA_DIST += autobuild.m4 estream.m4
diff --git a/m4/Makefile.in b/m4/Makefile.in
index 26802d5..6a7e1a3 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -15,23 +14,51 @@
@SET_MAKE@
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
esac; \
- test $$am__dry = yes; \
- }
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -51,29 +78,36 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = m4
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
AM_V_at = $(am__v_at_@AM_V@)
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
+am__v_at_1 =
SOURCES =
DIST_SOURCES =
am__can_run_installinfo = \
@@ -81,6 +115,7 @@ am__can_run_installinfo = \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -94,6 +129,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -141,6 +177,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -241,7 +278,7 @@ EXTRA_DIST = inttypes-h.m4 lock.m4 visibility.m4 glibc2.m4 intmax.m4 \
glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 \
inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 \
lib-link.m4 lib-prefix.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 \
- ulonglong.m4 autobuild.m4
+ ulonglong.m4 autobuild.m4 estream.m4
all: all-am
.SUFFIXES:
@@ -281,11 +318,11 @@ mostlyclean-libtool:
clean-libtool:
-rm -rf .libs _libs
-tags: TAGS
-TAGS:
+tags TAGS:
+
+ctags CTAGS:
-ctags: CTAGS
-CTAGS:
+cscope cscopelist:
distdir: $(DISTFILES)
@@ -421,15 +458,16 @@ uninstall-am:
.MAKE: install-am install-strip
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-data install-data-am install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-info install-info-am install-man install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
+ cscopelist-am ctags-am distclean distclean-generic \
+ distclean-libtool distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags-am uninstall uninstall-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/m4/ac_prog_cc_for_build.m4 b/m4/ac_prog_cc_for_build.m4
index 42c91ce..32329c7 100644
--- a/m4/ac_prog_cc_for_build.m4
+++ b/m4/ac_prog_cc_for_build.m4
@@ -1,5 +1,5 @@
dnl Available from the GNU Autoconf Macro Archive at:
-dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_prog_cc_for_build.html
+dnl https://www.gnu.org/software/ac-archive/htmldoc/ac_prog_cc_for_build.html
dnl
dnl All content of this archive is free software;
dnl you can redistribute it and/or modify it under the terms of the GNU
diff --git a/m4/estream.m4 b/m4/estream.m4
new file mode 100644
index 0000000..402ef74
--- /dev/null
+++ b/m4/estream.m4
@@ -0,0 +1,49 @@
+dnl Autoconf macros for libestream
+dnl Copyright (C) 2007 g10 Code GmbH
+dnl
+dnl This file is free software; as a special exception the author gives
+dnl unlimited permission to copy and/or distribute it, with or without
+dnl modifications, as long as this notice is preserved.
+dnl
+dnl This file is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+dnl implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+dnl estream_PRINTF_INIT
+dnl Prepare build of source included estream-printf.c
+dnl
+AC_DEFUN([estream_PRINTF_INIT],
+[
+ AC_MSG_NOTICE([checking system features for estream-printf])
+ AC_CHECK_HEADERS(stdint.h)
+ AC_TYPE_LONG_LONG_INT
+ AC_TYPE_LONG_DOUBLE
+ AC_TYPE_INTMAX_T
+ AC_TYPE_UINTMAX_T
+ AC_CHECK_TYPES([ptrdiff_t])
+ AC_CHECK_SIZEOF([unsigned long])
+ AC_CHECK_SIZEOF([void *])
+ AC_CACHE_CHECK([for nl_langinfo and THOUSANDS_SEP],
+ estream_cv_langinfo_thousands_sep,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(THOUSANDS_SEP); return !cs;],
+ estream_cv_langinfo_thousands_sep=yes,
+ estream_cv_langinfo_thousands_sep=no)
+ ])
+ if test $estream_cv_langinfo_thousands_sep = yes; then
+ AC_DEFINE(HAVE_LANGINFO_THOUSANDS_SEP, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(THOUSANDS_SEP).])
+ fi
+])
+
+
+dnl estream_INIT
+dnl Prepare build of source included estream.c
+dnl
+AC_DEFUN([estream_INIT],
+[
+ AC_REQUIRE([estream_PRINTF_INIT])
+ AC_MSG_NOTICE([checking system features for estream])
+ AC_CHECK_FUNCS([memrchr])
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
index c9ae1f7..be247bf 100644
--- a/m4/gettext.m4
+++ b/m4/gettext.m4
@@ -1,5 +1,5 @@
-# gettext.m4 serial 60 (gettext-0.17)
-dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
+# gettext.m4 serial 66 (gettext-0.18.2)
+dnl Copyright (C) 1995-2014 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.
@@ -15,7 +15,7 @@ dnl They are *not* in the public domain.
dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006.
+dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
dnl Macro to add for using GNU gettext.
@@ -35,7 +35,7 @@ dnl will be ignored. If NEEDSYMBOL is specified and is
dnl 'need-formatstring-macros', then GNU gettext implementations that don't
dnl support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
dnl INTLDIR is used to find the intl libraries. If empty,
-dnl the value `$(top_builddir)/intl/' is used.
+dnl the value '$(top_builddir)/intl/' is used.
dnl
dnl The result of the configuration is one of three cases:
dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
@@ -60,6 +60,8 @@ AC_DEFUN([AM_GNU_GETTEXT],
ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
[errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
])])])])])
+ ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+ [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
[errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
])])])])
@@ -95,7 +97,7 @@ AC_DEFUN([AM_GNU_GETTEXT],
AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
])
- dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation.
+ dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
gt_INTL_MACOSX
dnl Set USE_NLS.
@@ -123,11 +125,11 @@ AC_DEFUN([AM_GNU_GETTEXT],
gt_use_preinstalled_gnugettext=no
ifelse(gt_included_intl, yes, [
AC_MSG_CHECKING([whether included gettext is requested])
- AC_ARG_WITH(included-gettext,
+ AC_ARG_WITH([included-gettext],
[ --with-included-gettext use the GNU gettext library included here],
nls_cv_force_use_gnu_gettext=$withval,
nls_cv_force_use_gnu_gettext=no)
- AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+ AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
@@ -155,12 +157,18 @@ changequote([,])dnl
fi
AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
- [AC_TRY_LINK([#include <libintl.h>
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;],
- [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings],
+extern int *_nl_domain_bindings;
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+ ]])],
[eval "$gt_func_gnugettext_libc=yes"],
[eval "$gt_func_gnugettext_libc=no"])])
@@ -181,35 +189,47 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_b
gt_save_LIBS="$LIBS"
LIBS="$LIBS $LIBINTL"
dnl Now see whether libintl exists and does not depend on libiconv.
- AC_TRY_LINK([#include <libintl.h>
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
-const char *_nl_expand_alias (const char *);],
- [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
+const char *_nl_expand_alias (const char *);
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ]])],
[eval "$gt_func_gnugettext_libintl=yes"],
[eval "$gt_func_gnugettext_libintl=no"])
dnl Now see whether libintl exists and depends on libiconv.
if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
LIBS="$LIBS $LIBICONV"
- AC_TRY_LINK([#include <libintl.h>
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
-const char *_nl_expand_alias (const char *);],
- [bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")],
- [LIBINTL="$LIBINTL $LIBICONV"
- LTLIBINTL="$LTLIBINTL $LTLIBICONV"
- eval "$gt_func_gnugettext_libintl=yes"
- ])
+const char *_nl_expand_alias (const char *);
+ ]],
+ [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+ ]])],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ eval "$gt_func_gnugettext_libintl=yes"
+ ])
fi
CPPFLAGS="$gt_save_CPPFLAGS"
LIBS="$gt_save_LIBS"])
@@ -267,7 +287,7 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
if test "$gt_use_preinstalled_gnugettext" = "yes" \
|| test "$nls_cv_use_gnu_gettext" = "yes"; then
- AC_DEFINE(ENABLE_NLS, 1,
+ AC_DEFINE([ENABLE_NLS], [1],
[Define to 1 if translation of program messages to the user's native language
is requested.])
else
@@ -301,9 +321,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
fi
dnl For backward compatibility. Some packages may be using this.
- AC_DEFINE(HAVE_GETTEXT, 1,
+ AC_DEFINE([HAVE_GETTEXT], [1],
[Define if the GNU gettext() function is already present or preinstalled.])
- AC_DEFINE(HAVE_DCGETTEXT, 1,
+ AC_DEFINE([HAVE_DCGETTEXT], [1],
[Define if the GNU dcgettext() function is already present or preinstalled.])
fi
@@ -319,9 +339,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
fi
dnl Make all variables we use known to autoconf.
- AC_SUBST(BUILD_INCLUDED_LIBINTL)
- AC_SUBST(USE_INCLUDED_LIBINTL)
- AC_SUBST(CATOBJEXT)
+ AC_SUBST([BUILD_INCLUDED_LIBINTL])
+ AC_SUBST([USE_INCLUDED_LIBINTL])
+ AC_SUBST([CATOBJEXT])
dnl For backward compatibility. Some configure.ins may be using this.
nls_cv_header_intl=
@@ -329,36 +349,36 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
dnl For backward compatibility. Some Makefiles may be using this.
DATADIRNAME=share
- AC_SUBST(DATADIRNAME)
+ AC_SUBST([DATADIRNAME])
dnl For backward compatibility. Some Makefiles may be using this.
INSTOBJEXT=.mo
- AC_SUBST(INSTOBJEXT)
+ AC_SUBST([INSTOBJEXT])
dnl For backward compatibility. Some Makefiles may be using this.
GENCAT=gencat
- AC_SUBST(GENCAT)
+ AC_SUBST([GENCAT])
dnl For backward compatibility. Some Makefiles may be using this.
INTLOBJS=
if test "$USE_INCLUDED_LIBINTL" = yes; then
INTLOBJS="\$(GETTOBJS)"
fi
- AC_SUBST(INTLOBJS)
+ AC_SUBST([INTLOBJS])
dnl Enable libtool support if the surrounding package wishes it.
INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
- AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+ AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
])
dnl For backward compatibility. Some Makefiles may be using this.
INTLLIBS="$LIBINTL"
- AC_SUBST(INTLLIBS)
+ AC_SUBST([INTLLIBS])
dnl Make all documented variables known to autoconf.
- AC_SUBST(LIBINTL)
- AC_SUBST(LTLIBINTL)
- AC_SUBST(POSUB)
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ AC_SUBST([POSUB])
])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
index 66bc76f..4b29c5f 100644
--- a/m4/iconv.m4
+++ b/m4/iconv.m4
@@ -1,5 +1,5 @@
-# iconv.m4 serial AM6 (gettext-0.17)
-dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc.
+# iconv.m4 serial 18 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2014 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.
@@ -30,44 +30,55 @@ AC_DEFUN([AM_ICONV_LINK],
dnl Add $INCICONV to CPPFLAGS before performing the following checks,
dnl because if the user has installed libiconv and not disabled its use
dnl via --without-libiconv-prefix, he wants to use it. The first
- dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+ dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
am_save_CPPFLAGS="$CPPFLAGS"
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
- AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [
+ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
- AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
- [iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);],
- am_cv_func_iconv=yes)
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_func_iconv=yes])
if test "$am_cv_func_iconv" != yes; then
am_save_LIBS="$LIBS"
LIBS="$LIBS $LIBICONV"
- AC_TRY_LINK([#include <stdlib.h>
-#include <iconv.h>],
- [iconv_t cd = iconv_open("","");
- iconv(cd,NULL,NULL,NULL,NULL);
- iconv_close(cd);],
- am_cv_lib_iconv=yes
- am_cv_func_iconv=yes)
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+ ]],
+ [[iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);]])],
+ [am_cv_lib_iconv=yes]
+ [am_cv_func_iconv=yes])
LIBS="$am_save_LIBS"
fi
])
if test "$am_cv_func_iconv" = yes; then
- AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [
- dnl This tests against bugs in AIX 5.1 and HP-UX 11.11.
+ AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+ dnl Solaris 10.
am_save_LIBS="$LIBS"
if test $am_cv_lib_iconv = yes; then
LIBS="$LIBS $LIBICONV"
fi
- AC_TRY_RUN([
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
#include <iconv.h>
#include <string.h>
int main ()
{
+ int result = 0;
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful
returns. */
{
@@ -84,7 +95,47 @@ int main ()
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
- return 1;
+ result |= 1;
+ iconv_close (cd_utf8_to_88591);
+ }
+ }
+ /* Test against Solaris 10 bug: Failures are not distinguishable from
+ successful returns. */
+ {
+ iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+ if (cd_ascii_to_88591 != (iconv_t)(-1))
+ {
+ static const char input[] = "\263";
+ char buf[10];
+ const char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_ascii_to_88591,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ result |= 2;
+ iconv_close (cd_ascii_to_88591);
+ }
+ }
+ /* Test against AIX 6.1..7.1 bug: Buffer overrun. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static const char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ const char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ (char **) &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+ result |= 4;
+ iconv_close (cd_88591_to_utf8);
}
}
#if 0 /* This bug could be worked around by the caller. */
@@ -103,7 +154,8 @@ int main ()
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if ((int)res > 0)
- return 1;
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
}
}
#endif
@@ -117,13 +169,19 @@ int main ()
&& iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
/* Try HP-UX names. */
&& iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
- return 1;
- return 0;
-}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
- [case "$host_os" in
+ result |= 16;
+ return result;
+}]])],
+ [am_cv_func_iconv_works=yes],
+ [am_cv_func_iconv_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
*) am_cv_func_iconv_works="guessing yes" ;;
- esac])
+ esac
+changequote([,])dnl
+ ])
LIBS="$am_save_LIBS"
])
case "$am_cv_func_iconv_works" in
@@ -134,7 +192,7 @@ int main ()
am_func_iconv=no am_cv_lib_iconv=no
fi
if test "$am_func_iconv" = yes; then
- AC_DEFINE(HAVE_ICONV, 1,
+ AC_DEFINE([HAVE_ICONV], [1],
[Define if you have the iconv() function and it works.])
fi
if test "$am_cv_lib_iconv" = yes; then
@@ -147,34 +205,64 @@ int main ()
LIBICONV=
LTLIBICONV=
fi
- AC_SUBST(LIBICONV)
- AC_SUBST(LTLIBICONV)
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
])
-AC_DEFUN([AM_ICONV],
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl warnings.
+m4_define([gl_iconv_AC_DEFUN],
+ m4_version_prereq([2.64],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [m4_ifdef([gl_00GNULIB],
+ [[AC_DEFUN_ONCE(
+ [$1], [$2])]],
+ [[AC_DEFUN(
+ [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
[
AM_ICONV_LINK
if test "$am_cv_func_iconv" = yes; then
AC_MSG_CHECKING([for iconv declaration])
- AC_CACHE_VAL(am_cv_proto_iconv, [
- AC_TRY_COMPILE([
+ AC_CACHE_VAL([am_cv_proto_iconv], [
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
-#if defined(__STDC__) || defined(__cplusplus)
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif
-], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ ]],
+ [[]])],
+ [am_cv_proto_iconv_arg1=""],
+ [am_cv_proto_iconv_arg1="const"])
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
- AC_MSG_RESULT([$]{ac_t:-
- }[$]am_cv_proto_iconv)
- AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ AC_MSG_RESULT([
+ $am_cv_proto_iconv])
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
[Define as const if the declaration of iconv() needs const.])
+ dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+ m4_ifdef([gl_ICONV_H_DEFAULTS],
+ [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ if test -n "$am_cv_proto_iconv_arg1"; then
+ ICONV_CONST="const"
+ fi
+ ])
fi
])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
index 96c4e2c..ddc569f 100644
--- a/m4/lib-ld.m4
+++ b/m4/lib-ld.m4
@@ -1,50 +1,56 @@
-# lib-ld.m4 serial 3 (gettext-0.13)
-dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2003, 2009-2014 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 Subroutines of libtool.m4,
-dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
-dnl with libtool.m4.
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
-dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
AC_DEFUN([AC_LIB_PROG_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- acl_cv_prog_gnu_ld=yes ;;
+ acl_cv_prog_gnu_ld=yes
+ ;;
*)
- acl_cv_prog_gnu_ld=no ;;
+ acl_cv_prog_gnu_ld=no
+ ;;
esac])
with_gnu_ld=$acl_cv_prog_gnu_ld
])
-dnl From libtool-1.4. Sets the variable LD.
+dnl From libtool-2.4. Sets the variable LD.
AC_DEFUN([AC_LIB_PROG_LD],
-[AC_ARG_WITH(gnu-ld,
-[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
-test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
-AC_REQUIRE([AC_PROG_CC])dnl
+[AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+ [AS_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld [default=no]])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])dnl
+
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
+
ac_prog=ld
if test "$GCC" = yes; then
# Check if gcc -print-prog-name=ld gives a path.
- AC_MSG_CHECKING([for ld used by GCC])
+ AC_MSG_CHECKING([for ld used by $CC])
case $host in
*-*-mingw*)
# gcc leaves a trailing carriage return which upsets mingw
@@ -54,12 +60,12 @@ if test "$GCC" = yes; then
esac
case $ac_prog in
# Accept absolute paths.
- [[\\/]* | [A-Za-z]:[\\/]*)]
- [re_direlt='/[^/][^/]*/\.\./']
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+ while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
done
test -z "$LD" && LD="$ac_prog"
;;
@@ -77,33 +83,36 @@ elif test "$with_gnu_ld" = yes; then
else
AC_MSG_CHECKING([for non-GNU ld])
fi
-AC_CACHE_VAL(acl_cv_path_LD,
+AC_CACHE_VAL([acl_cv_path_LD],
[if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
+ IFS="$acl_save_ifs"
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
acl_cv_path_LD="$ac_dir/$ac_prog"
# Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
+ # but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
- case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+ case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break ;;
+ test "$with_gnu_ld" != no && break
+ ;;
*)
- test "$with_gnu_ld" != yes && break ;;
+ test "$with_gnu_ld" != yes && break
+ ;;
esac
fi
done
- IFS="$ac_save_ifs"
+ IFS="$acl_save_ifs"
else
acl_cv_path_LD="$LD" # Let the user override the test with a path.
fi])
LD="$acl_cv_path_LD"
if test -n "$LD"; then
- AC_MSG_RESULT($LD)
+ AC_MSG_RESULT([$LD])
else
- AC_MSG_RESULT(no)
+ AC_MSG_RESULT([no])
fi
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
AC_LIB_PROG_LD_GNU
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
index e3d26fc..3522d99 100644
--- a/m4/lib-link.m4
+++ b/m4/lib-link.m4
@@ -1,12 +1,12 @@
-# lib-link.m4 serial 13 (gettext-0.17)
-dnl Copyright (C) 2001-2007 Free Software Foundation, Inc.
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2014 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible.
-AC_PREREQ(2.54)
+AC_PREREQ([2.54])
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
dnl the libraries corresponding to explicit and implicit dependencies.
@@ -18,9 +18,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS],
[
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
AC_REQUIRE([AC_LIB_RPATH])
- define([Name],[translit([$1],[./-], [___])])
- define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
- [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
AC_LIB_LINKFLAGS_BODY([$1], [$2])
ac_cv_lib[]Name[]_libs="$LIB[]NAME"
@@ -39,16 +39,17 @@ AC_DEFUN([AC_LIB_LINKFLAGS],
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
dnl results of this search when this library appears as a dependency.
HAVE_LIB[]NAME=yes
- undefine([Name])
- undefine([NAME])
+ popdef([NAME])
+ popdef([Name])
])
-dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
dnl searches for libname and the libraries corresponding to explicit and
dnl implicit dependencies, together with the specified include files and
-dnl the ability to compile and link the specified testcode. If found, it
-dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
-dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
@@ -57,9 +58,9 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
[
AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
AC_REQUIRE([AC_LIB_RPATH])
- define([Name],[translit([$1],[./-], [___])])
- define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
- [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ pushdef([Name],[m4_translit([$1],[./+-], [____])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
dnl accordingly.
@@ -73,13 +74,26 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
ac_save_LIBS="$LIBS"
- LIBS="$LIBS $LIB[]NAME"
- AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+ dnl because these -l options might require -L options that are present in
+ dnl LIBS. -l options benefit only from the -L options listed before it.
+ dnl Otherwise, add it to the front of LIBS, because it may be a static
+ dnl library that depends on another static library that is present in LIBS.
+ dnl Static libraries benefit only from the static libraries listed after
+ dnl it.
+ case " $LIB[]NAME" in
+ *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+ *) LIBS="$LIB[]NAME $LIBS" ;;
+ esac
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[$3]], [[$4]])],
+ [ac_cv_lib[]Name=yes],
+ [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
LIBS="$ac_save_LIBS"
])
if test "$ac_cv_lib[]Name" = yes; then
HAVE_LIB[]NAME=yes
- AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
AC_MSG_CHECKING([how to link with lib[]$1])
AC_MSG_RESULT([$LIB[]NAME])
else
@@ -95,13 +109,15 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
AC_SUBST([LIB]NAME)
AC_SUBST([LTLIB]NAME)
AC_SUBST([LIB]NAME[_PREFIX])
- undefine([Name])
- undefine([NAME])
+ popdef([NAME])
+ popdef([Name])
])
dnl Determine the platform dependent parameters needed to use rpath:
dnl acl_libext,
dnl acl_shlibext,
+dnl acl_libname_spec,
+dnl acl_library_names_spec,
dnl acl_hardcode_libdir_flag_spec,
dnl acl_hardcode_libdir_separator,
dnl acl_hardcode_direct,
@@ -114,7 +130,7 @@ AC_DEFUN([AC_LIB_RPATH],
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
- AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
. ./conftest.sh
@@ -131,11 +147,32 @@ AC_DEFUN([AC_LIB_RPATH],
acl_hardcode_direct="$acl_cv_hardcode_direct"
acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
dnl Determine whether the user wants rpath handling at all.
- AC_ARG_ENABLE(rpath,
+ AC_ARG_ENABLE([rpath],
[ --disable-rpath do not hardcode runtime library paths],
:, enable_rpath=yes)
])
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_frompackage_]NAME, [$2])
+ popdef([NAME])
+ pushdef([PACK],[$2])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ define([acl_libsinpackage_]PACKUP,
+ m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+ popdef([PACKUP])
+ popdef([PACK])
+])
+
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
dnl the libraries corresponding to explicit and implicit dependencies.
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
@@ -144,19 +181,23 @@ dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
[
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
- define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
- [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+ pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+ pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
dnl Autoconf >= 2.61 supports dots in --with options.
- define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])
+ pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
dnl By default, look in $includedir and $libdir.
use_additional=yes
AC_LIB_WITH_FINAL_PREFIX([
eval additional_includedir=\"$includedir\"
eval additional_libdir=\"$libdir\"
])
- AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],
-[ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
- --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir],
+ AC_ARG_WITH(P_A_C_K[-prefix],
+[[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
+ --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
[
if test "X$withval" = "Xno"; then
use_additional=no
@@ -169,6 +210,10 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
else
additional_includedir="$withval/include"
additional_libdir="$withval/$acl_libdirstem"
+ if test "$acl_libdirstem2" != "$acl_libdirstem" \
+ && ! test -d "$withval/$acl_libdirstem"; then
+ additional_libdir="$withval/$acl_libdirstem2"
+ fi
fi
fi
])
@@ -178,6 +223,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
LTLIB[]NAME=
INC[]NAME=
LIB[]NAME[]_PREFIX=
+ dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+ dnl computed. So it has to be reset here.
+ HAVE_LIB[]NAME=
rpathdirs=
ltrpathdirs=
names_already_handled=
@@ -197,7 +245,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
names_already_handled="$names_already_handled $name"
dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
dnl or AC_LIB_HAVE_LINKFLAGS call.
- uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
eval value=\"\$HAVE_LIB$uppername\"
if test -n "$value"; then
if test "$value" = yes; then
@@ -327,7 +375,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
dnl Linking with a shared library. We attempt to hardcode its
dnl directory into the executable's runpath, unless it's the
dnl standard /usr/lib.
- if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
+ if test "$enable_rpath" = no \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
dnl No hardcoding is needed.
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
else
@@ -415,7 +465,16 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
case "$found_dir" in
*/$acl_libdirstem | */$acl_libdirstem/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
- LIB[]NAME[]_PREFIX="$basedir"
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem2 | */$acl_libdirstem2/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
additional_includedir="$basedir/include"
;;
esac
@@ -476,9 +535,11 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
dnl 3. if it's already present in $LDFLAGS or the already
dnl constructed $LIBNAME,
dnl 4. if it doesn't exist as a directory.
- if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
haveit=
- if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
if test -n "$GCC"; then
case $host_os in
linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@@ -609,6 +670,11 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
done
fi
+ popdef([P_A_C_K])
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
])
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
@@ -654,7 +720,8 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
if test -n "$next"; then
dir="$next"
dnl No need to hardcode the standard /usr/lib.
- if test "X$dir" != "X/usr/$acl_libdirstem"; then
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
rpathdirs="$rpathdirs $dir"
fi
next=
@@ -663,7 +730,8 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
-L) next=yes ;;
-L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
dnl No need to hardcode the standard /usr/lib.
- if test "X$dir" != "X/usr/$acl_libdirstem"; then
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2"; then
rpathdirs="$rpathdirs $dir"
fi
next= ;;
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
index a8684e1..31f49e4 100644
--- a/m4/lib-prefix.m4
+++ b/m4/lib-prefix.m4
@@ -1,5 +1,5 @@
-# lib-prefix.m4 serial 5 (gettext-0.15)
-dnl Copyright (C) 2001-2005 Free Software Foundation, Inc.
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2014 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.
@@ -153,33 +153,72 @@ AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
prefix="$acl_save_prefix"
])
-dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing
-dnl the basename of the libdir, either "lib" or "lib64".
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl "lib/amd64".
AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
[
- dnl There is no formal standard regarding lib and lib64. The current
- dnl practice is that on a system supporting 32-bit and 64-bit instruction
- dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit
- dnl libraries go under $prefix/lib. We determine the compiler's default
- dnl mode by looking at the compiler's library search path. If at least
- dnl of its elements ends in /lib64 or points to a directory whose absolute
- dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the
- dnl default, namely "lib".
+ dnl There is no formal standard regarding lib and lib64.
+ dnl On glibc systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+ dnl the compiler's default mode by looking at the compiler's library search
+ dnl path. If at least one of its elements ends in /lib64 or points to a
+ dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+ dnl Otherwise we use the default, namely "lib".
+ dnl On Solaris systems, the current practice is that on a system supporting
+ dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+ dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+ dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+ AC_REQUIRE([AC_CANONICAL_HOST])
acl_libdirstem=lib
- searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
- if test -n "$searchpath"; then
- acl_save_IFS="${IFS= }"; IFS=":"
- for searchdir in $searchpath; do
- if test -d "$searchdir"; then
- case "$searchdir" in
- */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
- *) searchdir=`cd "$searchdir" && pwd`
- case "$searchdir" in
- */lib64 ) acl_libdirstem=lib64 ;;
- esac ;;
+ acl_libdirstem2=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+ dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+ dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+ dnl symlink is missing, so we set acl_libdirstem2 too.
+ AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+ [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+ ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+ ])
+ if test $gl_cv_solaris_64bit = yes; then
+ acl_libdirstem=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem2=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
esac
fi
- done
- IFS="$acl_save_IFS"
- fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib64 ) acl_libdirstem=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
])
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 1d62b05..0cd84af 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -34,7 +34,7 @@ m4_define([_LT_COPYING], [dnl
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# can be downloaded from https://www.gnu.org/licenses/gpl.html, or
# obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
])
diff --git a/m4/nls.m4 b/m4/nls.m4
index 7967cc2..53cdc8b 100644
--- a/m4/nls.m4
+++ b/m4/nls.m4
@@ -1,5 +1,6 @@
-# nls.m4 serial 3 (gettext-0.15)
-dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc.
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
+dnl 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.
@@ -17,15 +18,15 @@ dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-AC_PREREQ(2.50)
+AC_PREREQ([2.50])
AC_DEFUN([AM_NLS],
[
AC_MSG_CHECKING([whether NLS is requested])
dnl Default is enabled NLS
- AC_ARG_ENABLE(nls,
+ AC_ARG_ENABLE([nls],
[ --disable-nls do not use Native Language Support],
USE_NLS=$enableval, USE_NLS=yes)
- AC_MSG_RESULT($USE_NLS)
- AC_SUBST(USE_NLS)
+ AC_MSG_RESULT([$USE_NLS])
+ AC_SUBST([USE_NLS])
])
diff --git a/m4/po.m4 b/m4/po.m4
index 0734762..84659ea 100644
--- a/m4/po.m4
+++ b/m4/po.m4
@@ -1,5 +1,5 @@
-# po.m4 serial 15 (gettext-0.17)
-dnl Copyright (C) 1995-2007 Free Software Foundation, Inc.
+# po.m4 serial 22 (gettext-0.19)
+dnl Copyright (C) 1995-2014 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.
@@ -17,19 +17,20 @@ dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-AC_PREREQ(2.50)
+AC_PREREQ([2.60])
dnl Checks for all prerequisites of the po subdirectory.
AC_DEFUN([AM_PO_SUBDIRS],
[
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
- AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+ AC_REQUIRE([AC_PROG_SED])dnl
AC_REQUIRE([AM_NLS])dnl
dnl Release version of the gettext macros. This is used to ensure that
dnl the gettext macros and po/Makefile.in.in are in sync.
- AC_SUBST([GETTEXT_MACRO_VERSION], [0.17])
+ AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
dnl Perform the following tests also if --disable-nls has been given,
dnl because they are needed for "make dist" to work.
@@ -41,7 +42,7 @@ AC_DEFUN([AM_PO_SUBDIRS],
[$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
(if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
:)
- AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
dnl Test whether it is GNU msgfmt >= 0.15.
changequote(,)dnl
@@ -102,7 +103,7 @@ changequote([,])dnl
case "$ac_file" in */Makefile.in)
# Adjust a relative srcdir.
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
- ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
# In autoconf-2.13 it is called $ac_given_srcdir.
# In autoconf-2.50 it is called $srcdir.
@@ -118,7 +119,8 @@ changequote([,])dnl
if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
rm -f "$ac_dir/POTFILES"
test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
- cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ gt_tab=`printf '\t'`
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
POMAKEFILEDEPS="POTFILES.in"
# ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
# on $ac_dir but don't depend on user-specified configuration
@@ -129,12 +131,12 @@ changequote([,])dnl
test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
fi
ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
- # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
else
# The set of available languages was given in configure.in.
- # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
fi
# Compute POFILES
@@ -226,7 +228,7 @@ AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
changequote(,)dnl
# Adjust a relative srcdir.
ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
- ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
# In autoconf-2.13 it is called $ac_given_srcdir.
# In autoconf-2.50 it is called $srcdir.
@@ -254,6 +256,7 @@ EOT
fi
# A sed script that extracts the value of VARIABLE from a Makefile.
+ tab=`printf '\t'`
sed_x_variable='
# Test if the hold space is empty.
x
@@ -261,9 +264,9 @@ s/P/P/
x
ta
# Yes it was empty. Look if we have the expected variable definition.
-/^[ ]*VARIABLE[ ]*=/{
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
# Seen the first line of the variable definition.
- s/^[ ]*VARIABLE[ ]*=//
+ s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
ba
}
bd
@@ -315,7 +318,7 @@ changequote([,])dnl
sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
fi
- # Hide the ALL_LINGUAS assigment from automake < 1.5.
+ # Hide the ALL_LINGUAS assignment from automake < 1.5.
eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
# Compute POFILES
# as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
@@ -405,14 +408,15 @@ changequote([,])dnl
fi
sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+ tab=`printf '\t'`
if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
# Add dependencies that cannot be formulated as a simple suffix rule.
for lang in $ALL_LINGUAS; do
frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
cat >> "$ac_file.tmp" <<EOF
$frobbedlang.msg: $lang.po
- @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
- \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
EOF
done
fi
@@ -422,8 +426,8 @@ EOF
frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
cat >> "$ac_file.tmp" <<EOF
$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
- @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
- \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
EOF
done
fi
diff --git a/m4/progtest.m4 b/m4/progtest.m4
index a56365c..b499f79 100644
--- a/m4/progtest.m4
+++ b/m4/progtest.m4
@@ -1,5 +1,5 @@
-# progtest.m4 serial 4 (gettext-0.14.2)
-dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc.
+# progtest.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1996-2003, 2005, 2008-2014 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.
@@ -16,7 +16,7 @@ dnl They are *not* in the public domain.
dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
-AC_PREREQ(2.50)
+AC_PREREQ([2.50])
# Search path for a program which passes the given test.
@@ -27,15 +27,14 @@ AC_DEFUN([AM_PATH_PROG_WITH_TEST],
# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conf$$.sh
- echo "exit 0" >>conf$$.sh
- chmod +x conf$$.sh
- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conf$$.sh
+ # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+ # contains only /bin. Note that ksh looks also at the FPATH variable,
+ # so we have to set that as well for the test.
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+ || PATH_SEPARATOR=';'
+ }
fi
# Find out how to test for executable files. Don't use a zero-byte file,
@@ -55,7 +54,7 @@ rm -f conf$$.file
# Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word])
-AC_CACHE_VAL(ac_cv_path_$1,
+AC_CACHE_VAL([ac_cv_path_$1],
[case "[$]$1" in
[[\\/]]* | ?:[[\\/]]*)
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
@@ -84,9 +83,9 @@ ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
esac])dnl
$1="$ac_cv_path_$1"
if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
- AC_MSG_RESULT([$]$1)
+ AC_MSG_RESULT([$][$1])
else
- AC_MSG_RESULT(no)
+ AC_MSG_RESULT([no])
fi
-AC_SUBST($1)dnl
+AC_SUBST([$1])dnl
])
diff --git a/m4/threadlib.m4 b/m4/threadlib.m4
index b015365..32c2ea5 100644
--- a/m4/threadlib.m4
+++ b/m4/threadlib.m4
@@ -67,7 +67,7 @@ changequote(,)dnl
dnl child process gets an endless segmentation fault inside execvp().
dnl Disable multithreading by default on Cygwin 1.5.x, because it has
dnl bugs that lead to endless loops or crashes. See
- dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
+ dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
osf*) gl_use_threads=no ;;
cygwin*)
case `uname -r` in
diff --git a/po/LINGUAS b/po/LINGUAS
index 9b1b405..bff6ab5 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -4,12 +4,17 @@ da
de
eo
fr
+hu
it
ja
nl
pl
+pt
ro
+ru
+sr
sv
uk
vi
zh_CN
+zh_TW
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
index eb68ea2..65184f6 100644
--- a/po/Makefile.in.in
+++ b/po/Makefile.in.in
@@ -1,5 +1,5 @@
# Makefile for PO directory in any package using GNU gettext.
-# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU General Public
@@ -8,13 +8,14 @@
# Please note that the actual code of GNU gettext is covered by the GNU
# General Public License and is *not* in the public domain.
#
-# Origin: gettext-0.17
-GETTEXT_MACRO_VERSION = 0.17
+# Origin: gettext-0.19
+GETTEXT_MACRO_VERSION = 0.19
PACKAGE = @PACKAGE@
VERSION = @VERSION@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+SED = @SED@
SHELL = /bin/sh
@SET_MAKE@
@@ -56,8 +57,8 @@ XGETTEXT_ = @XGETTEXT@
XGETTEXT_no = @XGETTEXT@
XGETTEXT_yes = @XGETTEXT_015@
XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
-MSGMERGE = msgmerge --previous
-MSGMERGE_UPDATE = @MSGMERGE@ --previous --update
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
MSGINIT = msginit
MSGCONV = msgconv
MSGFILTER = msgfilter
@@ -76,6 +77,16 @@ POTFILES = \
CATALOGS = @CATALOGS@
+POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
+POFILESDEPS_yes = $(POFILESDEPS_)
+POFILESDEPS_no =
+POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
+
+DISTFILESDEPS_ = update-po
+DISTFILESDEPS_yes = $(DISTFILESDEPS_)
+DISTFILESDEPS_no =
+DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
+
# Makevars gets inserted here. (Don't remove this line!)
.SUFFIXES:
@@ -88,22 +99,22 @@ CATALOGS = @CATALOGS@
.po.gmo:
@lang=`echo $* | sed -e 's,.*/,,'`; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
- echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
- cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
.sin.sed:
sed -e '/^#/d' $< > t-$@
mv t-$@ $@
-all: check-macro-version all-@USE_NLS@
+all: all-@USE_NLS@
all-yes: stamp-po
all-no:
# Ensure that the gettext macros and this Makefile.in.in are in sync.
-check-macro-version:
- @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+CHECK_MACRO_VERSION = \
+ test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
|| { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
exit 1; \
}
@@ -123,6 +134,7 @@ check-macro-version:
# $(POFILES) has been designed to not touch files that don't need to be
# changed.
stamp-po: $(srcdir)/$(DOMAIN).pot
+ @$(CHECK_MACRO_VERSION)
test ! -f $(srcdir)/$(DOMAIN).pot || \
test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
@test ! -f $(srcdir)/$(DOMAIN).pot || { \
@@ -137,11 +149,29 @@ stamp-po: $(srcdir)/$(DOMAIN).pot
# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+# The determination of whether the package xyz is a GNU one is based on the
+# heuristic whether some file in the top level directory mentions "GNU xyz".
+# If GNU 'find' is available, we avoid grepping through monster files.
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
- if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
- package_gnu='GNU '; \
+ package_gnu="$(PACKAGE_GNU)"; \
+ test -n "$$package_gnu" || { \
+ if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
+ LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \
+ -size -10000000c -exec grep 'GNU @PACKAGE@' \
+ /dev/null '{}' ';' 2>/dev/null; \
+ else \
+ LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
+ fi; \
+ } | grep -v 'libtool:' >/dev/null; then \
+ package_gnu=yes; \
+ else \
+ package_gnu=no; \
+ fi; \
+ }; \
+ if test "$$package_gnu" = "yes"; then \
+ package_prefix='GNU '; \
else \
- package_gnu=''; \
+ package_prefix=''; \
fi; \
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
@@ -161,7 +191,7 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
- --package-name="$${package_gnu}@PACKAGE@" \
+ --package-name="$${package_prefix}@PACKAGE@" \
--package-version='@VERSION@' \
--msgid-bugs-address="$$msgid_bugs_address" \
;; \
@@ -189,12 +219,20 @@ $(srcdir)/$(DOMAIN).pot:
# This target rebuilds a PO file if $(DOMAIN).pot has changed.
# Note that a PO file is not touched if it doesn't need to be changed.
-$(POFILES): $(srcdir)/$(DOMAIN).pot
+$(POFILES): $(POFILESDEPS)
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
if test -f "$(srcdir)/$${lang}.po"; then \
+ test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
- echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
- cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+ cd $(srcdir) \
+ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+ *) \
+ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+ esac; \
+ }; \
else \
$(MAKE) $${lang}.po-create; \
fi
@@ -217,7 +255,6 @@ install-data: install-data-@USE_NLS@
fi
install-data-no: all
install-data-yes: all
- $(mkdir_p) $(DESTDIR)$(datadir)
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
@@ -269,7 +306,6 @@ installdirs-data: installdirs-data-@USE_NLS@
fi
installdirs-data-no:
installdirs-data-yes:
- $(mkdir_p) $(DESTDIR)$(datadir)
@catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \
cat=`basename $$cat`; \
@@ -347,7 +383,7 @@ maintainer-clean: distclean
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
dist distdir:
- $(MAKE) update-po
+ test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
@$(MAKE) dist2
# This is a separate target because 'update-po' must be executed before.
dist2: stamp-po $(DISTFILES)
@@ -395,9 +431,15 @@ update-po: Makefile
tmpdir=`pwd`; \
echo "$$lang:"; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
- echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
cd $(srcdir); \
- if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+ *) \
+ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+ esac; \
+ }; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \
else \
@@ -418,9 +460,13 @@ $(DUMMYPOFILES):
update-gmo: Makefile $(GMOFILES)
@:
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
cd $(top_builddir) \
- && $(SHELL) ./config.status $(subdir)/$@.in po-directories
+ && @SHELL@ ./config.status $(subdir)/$@.in po-directories
force:
diff --git a/po/Makevars b/po/Makevars
index 5ba1ad0..7585237 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -20,6 +20,13 @@ XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
# their copyright.
COPYRIGHT_HOLDER = g10 Code GmbH
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty. If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU = no
+
# This is the email address or URL to which the translators shall report
# bugs in the untranslated strings:
# - Strings which are not entire sentences, see the maintainer guidelines
@@ -40,3 +47,33 @@ MSGID_BUGS_ADDRESS = translations@gnupg.org
# This is the list of locale categories, beyond LC_MESSAGES, for which the
# message catalogs shall be used. It is usually empty.
EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context. Possible values are "yes" and "no". Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = no
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+# --previous to keep previous msgids of translated messages,
+# --quiet to reduce the verbosity.
+MSGMERGE_OPTIONS = --previous
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed. Possible values are "yes" and "no". Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = yes
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist". Possible values are "yes" and
+# "no". Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = yes
diff --git a/po/Rules-quot b/po/Rules-quot
index 9c2a995..9dc9630 100644
--- a/po/Rules-quot
+++ b/po/Rules-quot
@@ -1,3 +1,4 @@
+# This file, Rules-quot, can be copied and used freely without restrictions.
# Special Makefile rules for English message catalogs with quotation marks.
DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
@@ -14,13 +15,23 @@ en@boldquot.po-update: en@boldquot.po-update-en
.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"; 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 \
diff --git a/po/cs.gmo b/po/cs.gmo
index 0cb5733..aec56de 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index f53f022..f64305d 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -1,7 +1,7 @@
# Czech translation of libgpg-error.
# Copyright (C) 2009 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
-# Petr Pisar <petr.pisar@atlas.cz>, 2009, 2012.
+# Petr Pisar <petr.pisar@atlas.cz>, 2009, 2012, 2014.
#
# certificate chain → řetězec (posloupnost) certifikátů
# keybox → schránka (na klíÄe)
@@ -12,10 +12,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error 1.10\n"
+"Project-Id-Version: libgpg-error 1.18\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:08+0100\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-27 19:31+0100\n"
"Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n"
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
"Language: cs\n"
@@ -89,26 +89,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Nespecifikovaný zdroj"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Uživatelem definovaný zdroj 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Uživatelem definovaný zdroj 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Uživatelem definovaný zdroj 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Uživatelem definovaný zdroj 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Neznámý zdroj"
@@ -165,7 +169,7 @@ msgid "Invalid cipher algorithm"
msgstr "Neplatný šifrovací algoritmus"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "KlíÄenka otevÅ™ena"
#: src/err-codes.h:42
@@ -426,10 +430,8 @@ msgid "No agent running"
msgstr "Agent neběží"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
-msgstr "chyba agenta"
+msgstr "Chyba agenta"
#: src/err-codes.h:107
msgid "Invalid data"
@@ -873,56 +875,40 @@ msgid "Unknown elliptic curve"
msgstr "Neznámá eliptická křivka"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Zdvojená hodnota"
+msgstr "Zdvojený klíÄ"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "NejednoznaÄné jméno"
+msgstr "NejednoznaÄný výsledek"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "No crypto engine"
msgid "No crypto context"
-msgstr "Chybí kryptografická jednotka"
+msgstr "Chybí kryptografický kontext"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "No crypto engine"
msgid "Wrong crypto context"
-msgstr "Chybí kryptografická jednotka"
+msgstr "Chybný kryptografický kontext"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Neplatná kryptografická jednotka"
+msgstr "Špatný kryptografický kontext"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Rozpor v kryptografickém kontextu"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Žádný veÅ™ejný klíÄ"
+msgstr "Rozbitý veÅ™ejný klíÄ"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Žádný tajný klíÄ"
+msgstr "Rozbitý tajný klíÄ"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Neplatný hashovací algoritmus"
+msgstr "Neplatný algoritmus MAC"
#: src/err-codes.h:226
msgid "Operation fully cancelled"
@@ -989,197 +975,934 @@ msgid "Bad octal character in S-expression"
msgstr "Chybný osmiÄkový znak v S-výrazu"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Data nešifrována"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Neznámé jméno"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Žádný veÅ™ejný klíÄ"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Vyrovnávací paměť je příliš malá"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Příliš dlouhý řádek"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Chybí řetězec certifikátů"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Certifikát je příliš velký"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Neplatný záznam"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "Ověření MAC selhalo"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "NeoÄekávaná zpráva"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Komprese nebo dekomprese selhala"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "PoÄítadlo by pÅ™eteklo"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Přijata nepřekonatelná chybová zpráva"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Žádný šifrovací algoritmus"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Chybí certifikát klienta"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Přijato oznámení o uzavření"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Lístku vypršela platnost"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Chybný lístek"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Neznámá totožnost"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Chybná zpráva s certifikátem v zahájení"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Chybná zpráva s požadavkem na certifikát v zahájení"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Chybná zpráva o ověření certifikátu v zahájení"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Chybná zpráva se změnou šifry v zahájení"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Chybná zpráva s pozdravem klienta v zahájení"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Chybná zpráva s pozdravem serveru v zahájení"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Chybná zpráva o dokonÄení pozdravu serveru v zahájení"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Chybná zpráva o dokonÄení v zahájení"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Chybná zpráva o výmÄ›nÄ› klíÄe serveru v zahájení"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Chybná zpráva o výmÄ›nÄ› klíÄe klienta v zahájení"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Chybný řetězec"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "KlÃ­Ä zakázán"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Nelze provést s klíÄem na kartÄ›"
+
+#: src/err-codes.h:279
msgid "Invalid lock object"
msgstr "Neplatný objekt"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Obecná chyba IPC"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "IPC volání accept (přijmout) selhalo"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "IPC volání connect (připojit) selhalo"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Neplatná odpovÄ›Ä IPC"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Neplatná hodnota předaná do IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Neúplný řádek předán do IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Řádek předaný do IPC je příliš dlouhý"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Vnořené příkazy IPC"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Žádná data zpětného volání v IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Žádné dotazovací zpětné volání v IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Není serverem IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Není klientem IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problém se spuštěním serveru IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "Chyba Ätení IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "Chyba zápisu IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Příliš mnoho data pro vrstvu IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "NeoÄekávaný příkaz IPC"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Neznámý příkaz IPC"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "Chyba syntaxe IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "Volání IPC bylo zrušeno"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Žádný zdroj vstupu pro IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Žádný zdroj výstupu pro IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Chyba parametru IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Neznámý dotaz IPC"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Chybí kryptografická jednotka"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Zdvojená hodnota"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certifikát je příliš mladý"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Dodaný objekt je příliš krátký"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Neznámé jméno"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Neplatný kód operace"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Neznámé jméno"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Neznámá chyba systému"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Neplatný řetězec OID"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Neplatný S-výraz"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Chybí certifikát vydavatele"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Dešifrování selhalo"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Čas vypršel"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Obecná chyba IPC"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Obecná chyba"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Obecná chyba"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Obecná chyba Assuanu"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Obecná chyba"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Obecná chyba Assuanu"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Chyba zápisu IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Obecná chyba IPC"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "IPC volání connect (připojit) selhalo"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Obecná chyba"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Vyžadován reset karty"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Prvek nenalezen"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Nepodporováno"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "NeoÄekávaná chyba"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Nepodporovaná operace"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Chybný certifikát"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Neznámé rozšíření"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Čas vypršel"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "chyba dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "chyba dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Chyba Ätení IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Není serverem IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Úspěch"
+
+# Nastavení nebo nastavování?
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Chyba konfigurace"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Narušení protokolu"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Neznámé rozšíření"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Přijata nepřekonatelná chybová zpráva"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Obecná chyba"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Vyžadován reset karty"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Neplatný atribut"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Nepodporovaná ochrana"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Narušení protokolu"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Neplatná stav"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Žádný objekt CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Hardwarový problém"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Neplatná stav"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Chyba kódování"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Nepodporovaná ochrana"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Neplatná karta"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Není dostupný žádný server klíÄů"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Chybí akce"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Narušení protokolu"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Operace jeÅ¡tÄ› neskonÄila"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operace zrušena"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Příliš dlouhý řádek"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operace zrušena"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Obecná chyba IPC"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Zdroje vyÄerpány"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Narušení protokolu"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Neplatná stav"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Nepodporovaný certifikát"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Vyžadován reset karty"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Úspěch"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "NefunkÄní"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "NefunkÄní"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Není serverem IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Dešifrování selhalo"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Uživatelem definovaný chybový kód 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Uživatelem definovaný chybový kód 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Uživatelem definovaný chybový kód 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Uživatelem definovaný chybový kód 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Uživatelem definovaný chybový kód 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Uživatelem definovaný chybový kód 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Uživatelem definovaný chybový kód 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Uživatelem definovaný chybový kód 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Uživatelem definovaný chybový kód 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Uživatelem definovaný chybový kód 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Uživatelem definovaný chybový kód 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Uživatelem definovaný chybový kód 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Uživatelem definovaný chybový kód 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Uživatelem definovaný chybový kód 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Uživatelem definovaný chybový kód 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Uživatelem definovaný chybový kód 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Chyba systému bez Äísla chyby (errno)"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Neznámá chyba systému"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Konec souboru"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Neznámý kód chyby"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Použití: %s CHYBA_GPG […]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: pozor: %s nebylo možné rozpoznat\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Zdroje vyÄerpány"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Neplatná data"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Obecná chyba"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "chyba dirmngr"
diff --git a/po/da.gmo b/po/da.gmo
index cf3fd75..a302b84 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index f8ba891..ccdb67c 100644
--- a/po/da.po
+++ b/po/da.po
@@ -1,7 +1,7 @@
# Danish translation libgpg-error.
-# Copyright (C) 2012 g10 Code GmbH og nedenstående oversættere.
+# Copyright (C) 2014 g10 Code GmbH og nedenstående oversættere.
# This file is distributed under the same license as the libgpg-error package.
-# Joe Hansen <joedalton2@yahoo.dk>, 2012.
+# Joe Hansen <joedalton2@yahoo.dk>, 2012, 2014.
#
# invalid -> ugyldig
# bad -> ødelagt
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.10\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:08+0100\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-17 20:08+0100\n"
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
"Language-Team: Danish <debian-l10n-danish@lists.debian.org>\n"
"Language: da\n"
@@ -85,26 +85,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Enhver kilde"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Brugerdefineret kilde 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Brugerdefineret kilde 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Brugerdefineret kilde 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Brugerdefineret kilde 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Ukendt kilde"
@@ -161,7 +165,7 @@ msgid "Invalid cipher algorithm"
msgstr "Ugyldig chifferalgoritme"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Nøglering åben"
#: src/err-codes.h:42
@@ -422,10 +426,8 @@ msgid "No agent running"
msgstr "Ingen agent kører"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
-msgstr "agentfejl"
+msgstr "Agentfejl"
#: src/err-codes.h:107
msgid "Invalid data"
@@ -868,56 +870,40 @@ msgid "Unknown elliptic curve"
msgstr "Ukendt elliptisk kurve"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Duplikeret værdi"
+msgstr "Duplikeret nøgle"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "Tvetydigt navn"
+msgstr "Tvetydigt resultat"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "No crypto engine"
msgid "No crypto context"
-msgstr "Ingen cryptomotor"
+msgstr "Ingen cryptokontekst"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "No crypto engine"
msgid "Wrong crypto context"
-msgstr "Ingen cryptomotor"
+msgstr "Forkert cryptokontekst"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Ugyldig cryptomotor"
+msgstr "Ugyldig cryptokontekst"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Konflikt i cryptokonteksten"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Ingen offentlig nøgle"
+msgstr "Ødelagt offentlig nøgle"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Ingen hemmelig nøgle"
+msgstr "Ødelagt hemmelig nøgle"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Ugyldig sammendragsalgoritme"
+msgstr "Ugyldig MAC-algoritme"
#: src/err-codes.h:226
msgid "Operation fully cancelled"
@@ -984,197 +970,934 @@ msgid "Bad octal character in S-expression"
msgstr "Ødelagt oktalt tegn i S-udtryk"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Ugyldigt objekt"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Data er ikke krypteret"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Ukendt navn"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Ingen offentlig nøgle"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffer for kort"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Linje er for lang"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Ingen certifikatkæde"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Certifikatet er for stort"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Ugyldig post"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "MAC'en verificerer ikke"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Uventet besked"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Pakning eller udpakning mislykkedes"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "En tæller ville pakke ind"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Modtog »fatal alarm«-besked"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Ingen chifferalgoritme"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Manglende klientcertfikat"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Luk modtaget påmindelse"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Billetten udløbet"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Ødelagt billet"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Ukendt identitet"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Besked om ødelagt certifikat i håndtrykket"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Besked om ødelagt certifikatforespørgsel i håndtrykket"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Besked om ødelagt certifikatforespørgsel i håndtrykket"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Ødelagt »ændr chiffer«-besked i håndtrykket"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Besked om ødelagt klienthilsen i håndtrykket"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Besked om ødelagt serverhilsen i håndtrykket"
+
+# engelsk fejl
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Ødelagt »afsluttet serverhilsen«-besked i håndtrykket"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Ødelagt »afsluttet«-besked i håndtrykket"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Besked om ødelagt udveksling af servernøgle i håndtrykket"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Besked om ødelagt udveksling af klientnøgle i håndtrykket"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Fejlbehæftet streng"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Nøglen er deaktiveret"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Ikke muligt med en kortbaseret nøgle"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Ugyldigt låseobjekt"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Generel IPC-fejl"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "IPC-acceptkald mislykkedes"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "IPC-forbindelseskald mislykkedes"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Ugyldigt IPC-svar"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Ugyldig værdi sendt til IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Ufuldstændig linje sendt til IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Linje sendt til IPC er for lang"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Indlejrede IPC-kommandoer"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Ingen datatilbagekald i IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Ingen inquire-tilbagekald i IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Ikke en IPC-server"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Ikke en IPC-klient"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problem med at starte IPC-server"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "IPC-læsefejl"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "IPC-skrivefejl"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "For mange data for IPC-lag"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Uventet IPC-kommando"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Ukendt IPC-kommando"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "IPC-syntaksfejl"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "IPC-kald er blevet afbrudt"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Ingen inddatakilde for IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Ingen uddatakilde for IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "IPC-parameterfejl"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Ukendt IPC-inquire"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Ingen cryptomotor"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Duplikeret værdi"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certifikat for ungt"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Angivet objekt er for kort"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Ukendt navn"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Ugyldig handlingskode"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Ukendt navn"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Ukendt systemfejl"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Ugyldig OID-streng"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Ugyldigt S-udtryk"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Manglende udstedercertfikat"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Afkryptering mislykkedes"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tidsudløb"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Generel IPC-fejl"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Generel fejl"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Generel fejl"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Generel Assuanfejl"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Generel fejl"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Generel Assuanfejl"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC-skrivefejl"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Generel IPC-fejl"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "IPC-forbindelseskald mislykkedes"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Generel fejl"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Kortnulstilling krævet"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Element er ikke fundet"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Ikke understøttet"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Uventet fejl"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Ej understøttet handling"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Ødelagt certifikat"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Ukendt udvidelse"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tidsudløb"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "dirmngr-fejl"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "dirmngr-fejl"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC-læsefejl"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Ikke en IPC-server"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Lykkedes"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Konfigurationsfejl"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Protokolovertrædelse"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Ukendt udvidelse"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Modtog »fatal alarm«-besked"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Generel fejl"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Kortnulstilling krævet"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Ugyldig attribut"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Ej understøttet beskyttelse"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Protokolovertrædelse"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Ugyldig tilstand"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Intet CMS-objekt"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Maskinelt problem"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ugyldig tilstand"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Kodningsproblem"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Ej understøttet beskyttelse"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Ugyldigt kort"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Ingen nøgleserver tilgængelig"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Manglende handling"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Protokolovertrædelse"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Handling ikke færdig endnu"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Handling afbrudt"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Linje er for lang"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Handling afbrudt"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Generel IPC-fejl"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Ressourcer opbrugt"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Protokolovertrædelse"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Ugyldig tilstand"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Ej understøttet certifikat"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Kortnulstilling krævet"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Lykkedes"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Ikke funktionsdygtig"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Ikke funktionsdygtig"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Ikke en IPC-server"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Afkryptering mislykkedes"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Brugerdefineret fejlkode 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Brugerdefineret fejlkode 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Brugerdefineret fejlkode 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Brugerdefineret fejlkode 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Brugerdefineret fejlkode 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Brugerdefineret fejlkode 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Brugerdefineret fejlkode 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Brugerdefineret fejlkode 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Brugerdefineret fejlkode 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Brugerdefineret fejlkode 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Brugerdefineret fejlkode 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Brugerdefineret fejlkode 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Brugerdefineret fejlkode 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Brugerdefineret fejlkode 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Brugerdefineret fejlkode 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Brugerdefineret fejlkode 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Systemfejl w/o errno"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Ukendt systemfejl"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Slutning på fil"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Ukendt fejlkode"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Brug: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: advarsel: kunne ikke genkende %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Ressourcer opbrugt"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Ugyldige data"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Generel fejl"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "dirmngr-fejl"
diff --git a/po/de.gmo b/po/de.gmo
index 8df3499..d044db2 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index dcf9f01..bffe9b4 100644
--- a/po/de.po
+++ b/po/de.po
@@ -5,13 +5,13 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error-1.9\n"
+"Project-Id-Version: libgpg-error-1.19\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2014-04-15 12:55+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2017-02-28 12:47+0100\n"
"Last-Translator: Werner Koch <wk@gnupg.org>\n"
"Language-Team: none\n"
-"Language: \n"
+"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -81,26 +81,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Unspezifische Quelle"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Benutzerdefinierte Quelle 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Benutzerdefinierte Quelle 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Benutzerdefinierte Quelle 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Benutzerdefinierte Quelle 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Unbekannte Quelle"
@@ -157,7 +161,7 @@ msgid "Invalid cipher algorithm"
msgstr "Ungültiges Verschlüsselungsverfahren"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Schlüsselbund kann nicht geöffnet werden"
#: src/err-codes.h:42
@@ -394,7 +398,7 @@ msgstr "Ungültiger Verschlüsselungsmodus"
#: src/err-codes.h:100
msgid "Invalid flag"
-msgstr "Ungültiges Flag"
+msgstr "Ungültige Flagge"
#: src/err-codes.h:101
msgid "Invalid handle"
@@ -964,195 +968,781 @@ msgid "Bad octal character in S-expression"
msgstr "Falsches Oktal-Zeichen in S-expression"
#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr "Alle Unterschlüssel sind abgelaufen oder widerrufen"
+
+#: src/err-codes.h:243
+msgid "Database is corrupted"
+msgstr "Beschädigte Datenbank"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr "Server zeigt einen unbestimmten Fehler an"
+
+#: src/err-codes.h:245
+msgid "No name"
+msgstr "Kein Name"
+
+#: src/err-codes.h:246
+msgid "No key"
+msgstr "Kein Schlüssel"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr "Veralteter Schlüssel"
+
+#: src/err-codes.h:248
+msgid "Request too short"
+msgstr "Anfrage zu kurz"
+
+#: src/err-codes.h:249
+msgid "Request too long"
+msgstr "Zeile ist zu lang"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr "Objekt befindet sich im \"Termination\" Status"
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Fehlende Zertifikatkette"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Zertifikat ist zu gross"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Ungültiger Datensatz"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "Der MAC ist nicht gültig"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Unerwartete Nachricht"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "(De-)Komprimierung fehlgeschlagen"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Ein Zähler würde überlaufen"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Fatale \"Alert\" Nachricht erhalten"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Kein Verschlüsselungsverfahren"
+
+# "in der Kette" ist part of the message because many users know about
+# certificate chains and thus that keyword might give them a good hint
+# what might be wrong.
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Fehlendes Benutzerzertifikat"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "\"Close\" Benachrichtigung erhalten"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Ticket abgelaufen"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Fehlerhaftes Ticket"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Unbekannte Indentität"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Fehlerhafte Zertifikatnachricht im Handshake"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Fehlerhafte Zertifikatsanforderungsnachricht im Handshake"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Fehlerhafte Zertifikatsüberprüfungsnachricht im Handshake"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Fehlerhafte Verschlüsselungsalgorithmuswechselnachricht im Handshake"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Fehlerhafte \"Client Hello\" Nachricht im Handshake"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Fehlerhafte \"Server Hello\" Nachricht im Handshake"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Fehlerhafte \"Server Hello Done\" Nachricht im Handshake"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Fehlerhafte \"Finished\" Nachricht im Handshake"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Fehlerhafte \"Server Key Exchange\" Nachricht im Handshake"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Fehlerhafte \"Client Key Exchange\" Nachricht im Handshake"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Fehlerhafter String"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr "Verboten"
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Schlüssel abgeschaltet"
+
+#: src/err-codes.h:278
msgid "Not possible with a card based key"
msgstr "Nicht möglich mit einem kartenbasierten Schlüssel"
-#: src/err-codes.h:243
+#: src/err-codes.h:279
msgid "Invalid lock object"
msgstr "Ungültiges Sperr-Objekt"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr "Wahr"
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr "Falsch"
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Allgemeiner IPC Fehler"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "IPC \"accept\" Aufruf fehlgeschlagen"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "IPC \"connect\" Aufruf fehlgeschlagen"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Ungültige IPC Antwort"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Ungültiger Wert an IPC übergeben"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Unvollständige Zeile an IPC übergeben"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "An die IPC übergebene Zeile ist zu lang"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Verschachtelte IPC Kommandos"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Kein Daten vom IPC \"Callback\""
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Kein \"Inquire\" \"Callback\" für IPC gesetzt"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Kein IPC Server"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Kein IPC Client"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problem beim Starten des IPC Servers"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "IPC Lesefehler"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "IPC Schreibfehler"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Zu viele Daten für das IPC Ebene"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Unerwartetes IPC Kommando"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Unbekanntes IPC Kommando"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "IPC Syntaxfehler"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "Der IPC Aufruf wurde abgebrochen"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Eingabequelle für IPC fehlt"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Ausgabesenke für IPC fehlt"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "IPC Parameterfehler"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Unbekanntes IPC \"Inquire\""
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+msgid "Crypto engine too old"
+msgstr "Die Krypto-Engine ist zu alt"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr "Bildschirmfenster ist zu klein"
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr "Bildschirmfenster ist zu groß"
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr "Eine notwendige Umgebungsvariable ist nicht gesetzt"
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr "Die User-ID existiert bereits"
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr "Der Name existiert bereits"
+
+#: src/err-codes.h:312
+msgid "Duplicated name"
+msgstr "Doppelter Name"
+
+#: src/err-codes.h:313
+msgid "Object is too young"
+msgstr "Objekt zu jung"
+
+#: src/err-codes.h:314
+msgid "Object is too old"
+msgstr "Objekt zu alt"
+
+#: src/err-codes.h:315
+msgid "Unknown flag"
+msgstr "Unbekannte Flagge"
+
+#: src/err-codes.h:316
+msgid "Invalid execution order"
+msgstr "Ungültige Verarbeitungsreihenfolge"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr "Bereits geholt"
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr "Später erneut versuchen"
+
+#: src/err-codes.h:319
+msgid "Wrong name"
+msgstr "Falscher Name"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr "Fehler im System entdeckt"
+
+#: src/err-codes.h:321
+msgid "Unknown DNS error"
+msgstr "Unbekannter DNS Fehler"
+
+#: src/err-codes.h:322
+msgid "Invalid DNS section"
+msgstr "Ungültige DNS \"Section\""
+
+#: src/err-codes.h:323
+msgid "Invalid textual address form"
+msgstr "Ungültige Textadressenformat"
+
+# "in der Kette" ist part of the message because many users know about
+# certificate chains and thus that keyword might give them a good hint
+# what might be wrong.
+#: src/err-codes.h:324
+msgid "Missing DNS query packet"
+msgstr "Fehlendes DNS Anfragepaket"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr "Fehlendes DNS Antwortpaket"
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr "Verbindung im DNS geschlossen"
+
+#: src/err-codes.h:327
+msgid "Verification failed in DNS"
+msgstr "Prüfung im DNS fehlgeschlagen"
+
+#: src/err-codes.h:328
+msgid "DNS Timeout"
+msgstr "DNS Zeitüberschreitung"
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr "Allgemeiner LDAP Fehler"
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr "Allgemeiner LDAP Attributfehler"
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr "Allgemeiner LDAP Namensfehler"
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr "Allgemeiner LDAP Sicherheitsfehler"
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr "Allgemeiner LDAP Servicefehler"
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr "Allgemeiner LDAP \"Update\" Fehler"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr "Experimenteller LDAP Fehlercode"
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr "Privater LDAP Fehlercode"
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr "Sonstiger allgemeiner LDAP Fehler"
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr "Fehler beim LDAP Verbindungsaufbau (X)"
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr "Grenze für LDAP Verweise überschritten"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr "Schleife im LDAP Client entdeckt"
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr "Keine LDAP Ergebnisse"
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr "LDAP \"Control\" nicht gefunden"
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr "Von LDAP nicht unterstützt"
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr "LDAP Verbindungsfehler"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr "Nicht genügend Speicher für LDAP Operation"
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr "Ungültiger Parameter an LDAP Funktion übergeben"
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr "LDAP Verarbeitung durch Benutzer abgebrochen"
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr "Fehlerhaftes LDAP Suchfilter"
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr "Unbekanntes LDAP Authentifizierungsverfahren"
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr "Zeitüberschreitung (LDAP)"
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr "LDAP Dekodierungsfehler"
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr "LDAP Kodierungsfehler"
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr "Lokaler LDAP Fehler"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr "Verbindung zum LDAP Server nicht möglich"
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr "LDAP erfolgreich"
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr "LDAP Konfigurationsfehler"
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr "LDAP Protokollverletzung"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr "Zeitgrenze von LDAP überschritten"
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr "Größengrenze von LDAP überschritten"
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr "LDAP Vergleich falsch"
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr "LDAP Vergleich richtig"
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr "LDAP Authentifizierungsverfahren nicht unterstützt"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr "Starke LDAP Authentifizierung benötigt"
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr "Partielle LDAP Ergebnisse und Verweise erhalten"
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr "LDAP Verweise"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr "Administrative LDAP Grenze überschritten"
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr "Kritische LDAP Erweiterung nicht vorhanden"
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr "Vertraulichkeit von LDAP angefordert"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr "LDAP SALS \"bind\" wird durchgeführt"
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr "Kein solches LDAP Attribut"
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr "Ungültiger LDAP Attributtyp"
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr "Unpassende Zusammenstellung in LDAP"
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr "Bedingung nicht eingehalten in LDAP"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr "LDAP Typ oder Wert existiert"
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr "Ungültiger Status in LDAP"
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr "Kein solches LDAP Objekt"
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr "Problem mit LDAP Alias"
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ungültiger DN Synatx in LDAP"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr "LDAP Element ist ein \"leaf\""
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr "Problem bei der Auflösung eines LDAP Aliases"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr "LDAP Proxy Authentifizierung fehlgeschlagen (X)"
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr "Unpassende LDAP Authentifizierung"
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr "Ungültige LDAP Credentials"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr "Ungenügende Zugriffsrechte für LDAP"
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr "LDAP Server ist beschäftigt"
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr "LDAP Server nicht verfügbar"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr "LDAP Server weigert sich etwas durchzuführen"
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr "LDAP hat eine Schleife erkannt"
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr "LDAP Benennungsverletzung"
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr "Verletzung der LDAP Objektklasse"
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "LDAP Operation auf einem Nicht-\"Leaf\" ist nicht erlaubt"
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr "LDAP Operation nicht erlaubt auf einem RDN"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr "Existiert bereits (LDAP)"
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr "Die LDAP Objektklasse kann nicht geändert werden"
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr "LDAP Ergebnisse sind zu lang"
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr "LDAP Operation betrifft mehrere DSAs"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr "Fehler in virtueller LDAP \"list view\""
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr "Sonstiger allgemeiner LDAP Fehler"
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr "Ressourcen erschöpft in LCUP"
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr "Sicherheitsverletzung in LCUP"
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr "Ungültige Daten in LDAP"
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr "Nicht unterstütztes Schema in LCUP"
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr "\"Reload\" notwendig in LCUP"
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr "LDAP wurde abgebrochen"
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr "Fehlende LDAP Operation zum abbrechen"
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr "Zu spät um LDAP Operation abzubrechen"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr "LDAP Operation kann nicht abgebrochen werden"
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr "LDAP \"Assertion\" fehlgeschlagen"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr "LDAP Authentifizierung via Proxy wurde verweigert"
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Benutzerdefinierter Fehlercode 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Benutzerdefinierter Fehlercode 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Benutzerdefinierter Fehlercode 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Benutzerdefinierter Fehlercode 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Benutzerdefinierter Fehlercode 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Benutzerdefinierter Fehlercode 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Benutzerdefinierter Fehlercode 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Benutzerdefinierter Fehlercode 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Benutzerdefinierter Fehlercode 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Benutzerdefinierter Fehlercode 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Benutzerdefinierter Fehlercode 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Benutzerdefinierter Fehlercode 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Benutzerdefinierter Fehlercode 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Benutzerdefinierter Fehlercode 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Benutzerdefinierter Fehlercode 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Benutzerdefinierter Fehlercode 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Systemfehler ohne gesetzten Systemfehlercode"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Unbekannter Systemfehler"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Dateiende"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Unbekannter Fehlercode"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Aufruf: %s GPG-FEHLER [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: Warnung: %s konnte nicht erkannt werden\n"
+
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "LCUP Ressourcen erschöpft"
+
+#~ msgid "LCUP Invalid data"
+#~ msgstr "LCUP Ungültige Daten"
+
+#~ msgid "LDAP Other general error"
+#~ msgstr "Sonstiger allgemeiner LDAP Fehler"
+
+#~ msgid "Encoding error"
+#~ msgstr "Kodierungsfehler"
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
index fedb6a0..506ca9e 100644
--- 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).
diff --git a/po/en@quot.header b/po/en@quot.header
index a9647fc..6522f0c 100644
--- 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).
diff --git a/po/eo.gmo b/po/eo.gmo
index 01071b4..1099c7b 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 16d4802..4e7bff3 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.7\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: 2013-02-23 20:22+0100\n"
"Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
@@ -81,26 +81,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Iu ajn fonto"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Uzant-difinita fonto 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Uzant-difinita fonto 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Uzant-difinita fonto 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Uzant-difinita fonto 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Nekonata fonto"
@@ -157,7 +161,7 @@ msgid "Invalid cipher algorithm"
msgstr "Malvalida ĉifra algoritmo"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Malfermo de Ålosilringo"
#: src/err-codes.h:42
@@ -999,197 +1003,955 @@ msgid "Bad octal character in S-expression"
msgstr "MalÄusta okuma signo en S-esprimo"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Datumaro ne ĉifrita"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Nekonata nomo"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Neniu publika Ålosilo"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Bufro tro mallongas"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Linio tro longas"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "MalÄusta atestila ĉeno"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Atestilo tro novas"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "Malvalida karto"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Neatentida marko"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "Malvalida ĉifra algoritmo"
+
+#: src/err-codes.h:260
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing client certificate"
+msgstr "Mankas atestilo"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Atestilo estas senvalidita"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "Åœlosilo malvalidiÄis"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "MalÄusta publika Ålosilo"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Nekonata paketo"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "MalÄusta atestila ĉeno"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "Åœlosilo malvalidiÄis"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
#| msgid "Invalid object"
msgid "Invalid lock object"
msgstr "Malvalida objekto"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Äœenerala eraro de IPC"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Akcepta voko de IPC fiaskis"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Konekta voko de IPC fiaskis"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Malvalida respondo de IPC"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Malvalida valoro estis pasata al IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Nekompleta linio estis pasata al IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Pasita linio al IPC tro longas"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Nestitaj komandoj IPC"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Neniu datumar funkcivoko en IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Neniu enketa funkcivoko en IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Ne estas servilo IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Ne estas kliento IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problemo dum ekigo de servilo IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "Leg-eraro de IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "Skrib-eraro de IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Tro multa datumaro por tavolo IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Neatendita komando IPC"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Nekonata komando IPC"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "Sintaks-eraro de IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "IPC-voko estas nuligita"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Neniu enig-fonto por IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Neniu elig-fonto por IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Parametra eraro de IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Nekonata enketo de IPC"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "Crypto engine too old"
+msgstr "Malvalida ĉifra maÅino"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Duobligita valoro"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Atestilo tro novas"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Provizita objekto tro mallongas"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nekonata nomo"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Malvalida operacia kodo"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Nekonata nomo"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Nekonata sistem-eraro"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Malvalida ĉeno OID"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Malvalida S-esprimo"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing DNS query packet"
+msgstr "Mankas atestilo"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Malĉifro fiaskis"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tempofino"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Äœenerala eraro de IPC"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Äœenerala eraro"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Äœenerala eraro"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Äœenerala eraro de Assuan"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Äœenerala eraro"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Äœenerala eraro de Assuan"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Skrib-eraro de IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Äœenerala eraro de IPC"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Konekta voko de IPC fiaskis"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Äœenerala eraro"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Kart-reekigo estas postulata"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Elemento ne estas trovita"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Ne subtenata"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Neatendita eraro"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Nesubtenata operacio"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "MalÄusta atestilo"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Nekonata aldono"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tempofino"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "eraro de dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "eraro de dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Leg-eraro de IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Ne estas servilo IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Sukceso"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Agord-eraro"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Perforto de protokolo"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Nekonata aldono"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Äœenerala eraro"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Kart-reekigo estas postulata"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Malvalida atributo"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Nesubtenata protekto"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Perforto de protokolo"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Malvalida stato"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Neniu objekto CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Problemo de aparataro"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Malvalida stato"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Ekodiga problemo"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Nesubtenata protekto"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Malvalida karto"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Mankas ago"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Perforto de protokolo"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "La operacio ankoraÅ­ ne finiÄis"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operacio estas nuligita"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Linio tro longas"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operacio estas nuligita"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Äœenerala eraro de IPC"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Rimedoj estas plenuzitaj"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Perforto de protokolo"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Malvalida stato"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Nesubtenata atestilo"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Kart-reekigo estas postulata"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Sukceso"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Ne operaciebla"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Ne operaciebla"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Ne estas servilo IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Malĉifro fiaskis"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Uzant-difinita erarkodo 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Uzant-difinita erarkodo 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Uzant-difinita erarkodo 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Uzant-difinita erarkodo 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Uzant-difinita erarkodo 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Uzant-difinita erarkodo 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Uzant-difinita erarkodo 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Uzant-difinita erarkodo 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Uzant-difinita erarkodo 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Uzant-difinita erarkodo 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Uzant-difinita erarkodo 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Uzant-difinita erarkodo 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Uzant-difinita erarkodo 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Uzant-difinita erarkodo 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Uzant-difinita erarkodo 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Uzant-difinita erarkodo 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Sistem-eraro sen errno"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Nekonata sistem-eraro"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Fino de dosiero"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Nekonata erar-kodo"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Uzmaniero: %s GPG-ERARO [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: averto: ne eblis rekoni %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Rimedoj estas plenuzitaj"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Malvalida datumaro"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Äœenerala eraro"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "eraro de dirmngr"
diff --git a/po/fr.gmo b/po/fr.gmo
index ace7f0e..d249121 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index b258c38..5df7dac 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,22 +1,22 @@
# French translation of Libgpg-error
-# Copyright (C) 2005, 2011, 2012 Free Software Foundation, Inc.
+# Copyright (C) 2005, 2011, 2012, 2014 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
#
# Stephane Roy <sroy@j2n.net>, 2005.
-# David Prévot <david@tilapin.org>, 2011, 2012.
+# David Prévot <david@tilapin.org>, 2011, 2012, 2014.
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error-1.10\n"
+"Project-Id-Version: libgpg-error-1.17\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:09+0100\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-01 22:07-0400\n"
"Last-Translator: David Prévot <david@tilapin.org>\n"
"Language-Team: French <traduc@traduc.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.4\n"
+"X-Generator: Lokalize 1.5\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/err-sources.h:28
@@ -84,26 +84,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "N'importe quelle source"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Source 1 définie par l'utilisateur"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Source 2 définie par l'utilisateur"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Source 3 définie par l'utilisateur"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Source 4 définie par l'utilisateur"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Source inconnue"
@@ -153,14 +157,14 @@ msgstr "Erreur de somme de contrôle"
#: src/err-codes.h:39
msgid "Bad passphrase"
-msgstr "Mauvaise phrase de passe"
+msgstr "Mauvaise phrase secrète"
#: src/err-codes.h:40
msgid "Invalid cipher algorithm"
msgstr "Algorithme de chiffrement incorrect"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Porte-clefs ouvert"
#: src/err-codes.h:42
@@ -420,8 +424,6 @@ msgid "No agent running"
msgstr "Pas d'agent en cours d'exécution"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
msgstr "Erreur d'agent"
@@ -539,7 +541,7 @@ msgstr "Protection corrompue"
#: src/err-codes.h:135
msgid "Ambiguous name"
-msgstr "Nom ambiguë"
+msgstr "Nom ambigu"
#: src/err-codes.h:136
msgid "Card error"
@@ -819,7 +821,7 @@ msgstr "Non opérationnel"
#: src/err-codes.h:205
msgid "No passphrase given"
-msgstr "Aucune phrase de passe fournie"
+msgstr "Aucune phrase secrète fournie"
#: src/err-codes.h:206
msgid "No PIN given"
@@ -866,56 +868,40 @@ msgid "Unknown elliptic curve"
msgstr "Courbe elliptique inconnue"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Valeur dupliquée"
+msgstr "Clef dupliquée"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "Nom ambiguë"
+msgstr "Résultat ambigu"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "No crypto engine"
msgid "No crypto context"
-msgstr "Aucun moteur de chiffrement"
+msgstr "Aucun contexte de chiffrement"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "No crypto engine"
msgid "Wrong crypto context"
-msgstr "Aucun moteur de chiffrement"
+msgstr "Contexte de chiffrement incorrect"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Moteur de chiffrement incorrect"
+msgstr "Mauvais contexte de chiffrement"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Conflit dans le contexte de chiffrement"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Pas de clef publique"
+msgstr "Clef publique cassée"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Pas de clef secrète"
+msgstr "Clef secrète cassée"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Algorithme de hachage incorrect"
+msgstr "Algorithme MAC incorrect"
#: src/err-codes.h:226
msgid "Operation fully cancelled"
@@ -982,197 +968,933 @@ msgid "Bad octal character in S-expression"
msgstr "Mauvais caractère octal dans l'expression symbolique"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Objet incorrect"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Données non chiffrées"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Nom inconnu"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Pas de clef publique"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Tampon trop court"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Ligne trop longue"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Aucune chaîne de certificat"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Le certificat est trop grand"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Enregistrement incorrect"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "Le MAC ne peut pas être vérifié"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Message inattendu"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Échec de compression ou décompression"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Un compteur devrait envelopper"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Message d’alerte fatale reçu"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Aucun algorithme de chiffrement"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Certificat de client manquant"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Notification de fermeture reçue"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Ticket expiré"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Mauvais ticket"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Identité inconnue"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Mauvais message de certificat dans l’initialisation"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Mauvais message de demande de certificat dans l’initialisation"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Mauvais message de vérification de certificat dans l’initialisation"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Mauvais message de modification d’algorithme dans l’initialisation"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Mauvais message de salut du client dans l’initialisation"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Mauvais message de salut du serveur dans l’initialisation"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Mauvais message de fin de salut du serveur dans l’initialisation"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Mauvais message fini dans l’initialisation"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Mauvais message d’échange de clef du serveur dans l’initialisation"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Mauvais message d’échange de clef du client dans l’initialisation"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Chaîne erronée"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Clef désactivée"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Impossible avec une clef basée sur carte"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Objet de verrouillage incorrect"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Erreur générale IPC"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Échec de l'appel IPC accept"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Échec de l'appel IPC connect"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Réponse IPC incorrecte"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Valeur incorrecte passée à IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Ligne incomplète transmise à IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Ligne trop longue transmise à IPC"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Commandes IPC imbriquées"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Aucune donnée de rappel dans IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Aucune requête de rappel dans IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Pas un serveur IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Pas un client IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problème au démarrage du serveur IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "Erreur de lecture IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "Erreur d'écriture IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Trop de données pour la couche IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Commande IPC inattendue"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Commande IPC inconnue"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "Erreur de syntaxe IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "L'appel IPC a été annulé"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Aucune source d'entrée pour IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Aucune source de sortie pour IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Erreur de paramètre IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Requête IPC inconnue"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Aucun moteur de chiffrement"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Valeur dupliquée"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certificat trop récent"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "L'objet fourni est trop petit"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nom inconnu"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Code d'opération incorrect"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Nom inconnu"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Erreur système inconnue"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Chaîne OID incorrecte"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Expression symbolique incorrecte"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Certificat de l'émetteur manquant"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Échec de déchiffrement"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Délai d'attente dépassé"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Erreur générale IPC"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Erreur générale"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Erreur générale"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Erreur générale Assuan"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Erreur générale"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Erreur générale Assuan"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Erreur d'écriture IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Erreur générale IPC"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Échec de l'appel IPC connect"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Erreur générale"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Réinitialisation de la carte nécessaire"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Élément non trouvé"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Non pris en charge"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Erreur inattendue"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Opération non prise en charge"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Mauvais certificat"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Extension inconnue"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Délai d'attente dépassé"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "Erreur de dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "Erreur de dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Erreur de lecture IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Pas un serveur IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Réussite"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Erreur de configuration"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Violation de protocole"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Extension inconnue"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Message d’alerte fatale reçu"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Erreur générale"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Réinitialisation de la carte nécessaire"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Attribut incorrect"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Protection non prise en charge"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Violation de protocole"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "État incorrect"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Pas d'objet CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Problème matériel"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "État incorrect"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Problème d'encodage"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Protection non prise en charge"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Carte incorrecte"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Aucun serveur de clefs disponible"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Action manquante"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Violation de protocole"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "L'opération n'est pas encore terminée"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Opération annulée"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Ligne trop longue"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Opération annulée"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Erreur générale IPC"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Ressources épuisées"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Violation de protocole"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "État incorrect"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Certificat non pris en charge"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Réinitialisation de la carte nécessaire"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Réussite"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Non opérationnel"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Non opérationnel"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Pas un serveur IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Échec de déchiffrement"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Code d'erreur 1 défini par l'utilisateur"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Code d'erreur 2 défini par l'utilisateur"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Code d'erreur 3 défini par l'utilisateur"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Code d'erreur 4 défini par l'utilisateur"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Code d'erreur 5 défini par l'utilisateur"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Code d'erreur 6 défini par l'utilisateur"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Code d'erreur 7 défini par l'utilisateur"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Code d'erreur 8 défini par l'utilisateur"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Code d'erreur 9 défini par l'utilisateur"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Code d'erreur 10 défini par l'utilisateur"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Code d'erreur 11 défini par l'utilisateur"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Code d'erreur 12 défini par l'utilisateur"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Code d'erreur 13 défini par l'utilisateur"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Code d'erreur 14 défini par l'utilisateur"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Code d'erreur 15 défini par l'utilisateur"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Code d'erreur 16 défini par l'utilisateur"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Erreur système sans numéro"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Erreur système inconnue"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Fin de fichier"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Code d'erreur inconnu"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Utilisation : %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s : attention : impossible de reconnaître %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Ressources épuisées"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Données incorrectes"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Erreur générale"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "Erreur de dirmngr"
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644
index 0000000..4b97b25
--- /dev/null
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..03a5a0c
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,1955 @@
+# Hungarian translations of libgpg-error.
+# Copyright (C) 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the libgpg-error package.
+#
+# Balázs Úr <urbalazs@gmail.com>, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: libgpg-error-1.7\n"
+"Report-Msgid-Bugs-To: translations@gnupg.org\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2015-01-09 10:00+0100\n"
+"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
+"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/err-sources.h:28
+msgid "Unspecified source"
+msgstr "Meghatározatlan forrás"
+
+#: src/err-sources.h:29
+msgid "gcrypt"
+msgstr "gcrypt"
+
+#: src/err-sources.h:30
+msgid "GnuPG"
+msgstr "GnuPG"
+
+#: src/err-sources.h:31
+msgid "GpgSM"
+msgstr "GpgSM"
+
+#: src/err-sources.h:32
+msgid "GPG Agent"
+msgstr "GPG ügynök"
+
+#: src/err-sources.h:33
+msgid "Pinentry"
+msgstr "Pinentry"
+
+#: src/err-sources.h:34
+msgid "SCD"
+msgstr "SCD"
+
+#: src/err-sources.h:35
+msgid "GPGME"
+msgstr "GPGME"
+
+#: src/err-sources.h:36
+msgid "Keybox"
+msgstr "Keybox"
+
+#: src/err-sources.h:37
+msgid "KSBA"
+msgstr "KSBA"
+
+#: src/err-sources.h:38
+msgid "Dirmngr"
+msgstr "Dirmngr"
+
+#: src/err-sources.h:39
+msgid "GSTI"
+msgstr "GSTI"
+
+#: src/err-sources.h:40
+msgid "GPA"
+msgstr "GPA"
+
+#: src/err-sources.h:41
+msgid "Kleopatra"
+msgstr "Kleopatra"
+
+#: src/err-sources.h:42
+msgid "G13"
+msgstr ""
+
+#: src/err-sources.h:43
+msgid "Assuan"
+msgstr ""
+
+#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
+msgid "Any source"
+msgstr "Bármilyen forrás"
+
+#: src/err-sources.h:46
+msgid "User defined source 1"
+msgstr "1. felhasználó által megadott forrás"
+
+#: src/err-sources.h:47
+msgid "User defined source 2"
+msgstr "2. felhasználó által megadott forrás"
+
+#: src/err-sources.h:48
+msgid "User defined source 3"
+msgstr "3. felhasználó által megadott forrás"
+
+#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr "4. felhasználó által megadott forrás"
+
+#: src/err-sources.h:50
+msgid "Unknown source"
+msgstr "Ismeretlen forrás"
+
+#: src/err-codes.h:28
+msgid "Success"
+msgstr "Sikeres"
+
+#: src/err-codes.h:29
+msgid "General error"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:30
+msgid "Unknown packet"
+msgstr "Ismeretlen csomag"
+
+#: src/err-codes.h:31
+msgid "Unknown version in packet"
+msgstr "Ismeretlen verzió a csomagban"
+
+#: src/err-codes.h:32
+msgid "Invalid public key algorithm"
+msgstr "Érvénytelen nyilvános kulcs algoritmus"
+
+#: src/err-codes.h:33
+msgid "Invalid digest algorithm"
+msgstr "Érvénytelen kivonat algoritmus"
+
+#: src/err-codes.h:34
+msgid "Bad public key"
+msgstr "Rossz nyilvános kulcs"
+
+#: src/err-codes.h:35
+msgid "Bad secret key"
+msgstr "Rossz titkos kulcs"
+
+#: src/err-codes.h:36
+msgid "Bad signature"
+msgstr "Rossz aláírás"
+
+#: src/err-codes.h:37
+msgid "No public key"
+msgstr "Nincs nyilvános kulcs"
+
+#: src/err-codes.h:38
+msgid "Checksum error"
+msgstr "Ellenőrzőösszeg hiba"
+
+#: src/err-codes.h:39
+msgid "Bad passphrase"
+msgstr "Rossz jelmondat"
+
+#: src/err-codes.h:40
+msgid "Invalid cipher algorithm"
+msgstr "Érvénytelen titkosító algoritmus"
+
+#: src/err-codes.h:41
+msgid "Cannot open keyring"
+msgstr "Kulcstartó nyitva"
+
+#: src/err-codes.h:42
+msgid "Invalid packet"
+msgstr "Érvénytelen csomag"
+
+#: src/err-codes.h:43
+msgid "Invalid armor"
+msgstr "Érvénytelen páncél"
+
+#: src/err-codes.h:44
+msgid "No user ID"
+msgstr "Nincs felhasználóazonosító"
+
+#: src/err-codes.h:45
+msgid "No secret key"
+msgstr "Nincs titkos kulcs"
+
+#: src/err-codes.h:46
+msgid "Wrong secret key used"
+msgstr "Hibás titkos kulcs lett használva"
+
+#: src/err-codes.h:47
+msgid "Bad session key"
+msgstr "Rossz munkamenet kulcs"
+
+#: src/err-codes.h:48
+msgid "Unknown compression algorithm"
+msgstr "Ismeretlen tömörítő algoritmus"
+
+#: src/err-codes.h:49
+msgid "Number is not prime"
+msgstr "A szám nem prím"
+
+#: src/err-codes.h:50
+msgid "Invalid encoding method"
+msgstr "Érvénytelen kódolási módszer"
+
+#: src/err-codes.h:51
+msgid "Invalid encryption scheme"
+msgstr "Érvénytelen titkosítás séma"
+
+#: src/err-codes.h:52
+msgid "Invalid signature scheme"
+msgstr "Érvénytelen aláírás séma"
+
+#: src/err-codes.h:53
+msgid "Invalid attribute"
+msgstr "Érvénytelen attribútum"
+
+#: src/err-codes.h:54
+msgid "No value"
+msgstr "Nincs érték"
+
+#: src/err-codes.h:55
+msgid "Not found"
+msgstr "Nem található"
+
+#: src/err-codes.h:56
+msgid "Value not found"
+msgstr "Nem található érték"
+
+#: src/err-codes.h:57
+msgid "Syntax error"
+msgstr "Szintaktikai hiba"
+
+#: src/err-codes.h:58
+msgid "Bad MPI value"
+msgstr "Rossz MPI érték"
+
+#: src/err-codes.h:59
+msgid "Invalid passphrase"
+msgstr "Érvénytelen jelmondat"
+
+#: src/err-codes.h:60
+msgid "Invalid signature class"
+msgstr "Érvénytelen aláírás osztály"
+
+#: src/err-codes.h:61
+msgid "Resources exhausted"
+msgstr "Az erőforrások kimerültek"
+
+#: src/err-codes.h:62
+msgid "Invalid keyring"
+msgstr "Érvénytelen kulcstartó"
+
+#: src/err-codes.h:63
+msgid "Trust DB error"
+msgstr "Megbízhatósági adatbázis hiba"
+
+#: src/err-codes.h:64
+msgid "Bad certificate"
+msgstr "Rossz tanúsítvány"
+
+#: src/err-codes.h:65
+msgid "Invalid user ID"
+msgstr "Érvénytelen felhasználóazonosító"
+
+#: src/err-codes.h:66
+msgid "Unexpected error"
+msgstr "Váratlan hiba"
+
+#: src/err-codes.h:67
+msgid "Time conflict"
+msgstr "Időütközés"
+
+#: src/err-codes.h:68
+msgid "Keyserver error"
+msgstr "Kulcskiszolgáló hiba"
+
+#: src/err-codes.h:69
+msgid "Wrong public key algorithm"
+msgstr "Hibás nyilvános kulcs algoritmus"
+
+#: src/err-codes.h:70
+msgid "Tribute to D. A."
+msgstr "Sarc a D. A. részére"
+
+#: src/err-codes.h:71
+msgid "Weak encryption key"
+msgstr "Gyenge titkosítási kulcs"
+
+#: src/err-codes.h:72
+msgid "Invalid key length"
+msgstr "Érvénytelen kulcshossz"
+
+#: src/err-codes.h:73
+msgid "Invalid argument"
+msgstr "Érvénytelen argumentum"
+
+#: src/err-codes.h:74
+msgid "Syntax error in URI"
+msgstr "Szintaktikai hiba az URI-ban"
+
+#: src/err-codes.h:75
+msgid "Invalid URI"
+msgstr "Érvénytelen URI"
+
+#: src/err-codes.h:76
+msgid "Network error"
+msgstr "Hálózati hiba"
+
+#: src/err-codes.h:77
+msgid "Unknown host"
+msgstr "Ismeretlen gép"
+
+#: src/err-codes.h:78
+msgid "Selftest failed"
+msgstr "Önellenőrzés sikertelen"
+
+#: src/err-codes.h:79
+msgid "Data not encrypted"
+msgstr "Az adatok nincsenek titkosítva"
+
+#: src/err-codes.h:80
+msgid "Data not processed"
+msgstr "Az adatok nincsenek feldolgozva"
+
+#: src/err-codes.h:81
+msgid "Unusable public key"
+msgstr "Használhatatlan nyilvános kulcs"
+
+#: src/err-codes.h:82
+msgid "Unusable secret key"
+msgstr "Használhatatlan titkos kulcs"
+
+#: src/err-codes.h:83
+msgid "Invalid value"
+msgstr "Érvénytelen érték"
+
+#: src/err-codes.h:84
+msgid "Bad certificate chain"
+msgstr "Rossz tanúsítványlánc"
+
+#: src/err-codes.h:85
+msgid "Missing certificate"
+msgstr "Hiányzó tanúsítvány"
+
+#: src/err-codes.h:86
+msgid "No data"
+msgstr "Nincsenek adatok"
+
+#: src/err-codes.h:87
+msgid "Bug"
+msgstr "Hiba"
+
+#: src/err-codes.h:88
+msgid "Not supported"
+msgstr "Nem támogatott"
+
+#: src/err-codes.h:89
+msgid "Invalid operation code"
+msgstr "Érvénytelen műveletkód"
+
+#: src/err-codes.h:90
+msgid "Timeout"
+msgstr "Időtúllépés"
+
+#: src/err-codes.h:91
+msgid "Internal error"
+msgstr "Belső hiba"
+
+#: src/err-codes.h:92
+msgid "EOF (gcrypt)"
+msgstr "EOF (gcrypt)"
+
+#: src/err-codes.h:93
+msgid "Invalid object"
+msgstr "Érvénytelen objektum"
+
+#: src/err-codes.h:94
+msgid "Provided object is too short"
+msgstr "A megadott objektum túl kicsi"
+
+#: src/err-codes.h:95
+msgid "Provided object is too large"
+msgstr "A megadott objektum túl nagy"
+
+#: src/err-codes.h:96
+msgid "Missing item in object"
+msgstr "Hiányzó elem az objektumban"
+
+#: src/err-codes.h:97
+msgid "Not implemented"
+msgstr "Nincs megvalósítva"
+
+#: src/err-codes.h:98
+msgid "Conflicting use"
+msgstr "Ütköző használat"
+
+#: src/err-codes.h:99
+msgid "Invalid cipher mode"
+msgstr "Érvénytelen titkosító mód"
+
+#: src/err-codes.h:100
+msgid "Invalid flag"
+msgstr "Érvénytelen jelző"
+
+#: src/err-codes.h:101
+msgid "Invalid handle"
+msgstr "Érvénytelen leíró"
+
+#: src/err-codes.h:102
+msgid "Result truncated"
+msgstr "Az eredmény csonkított"
+
+#: src/err-codes.h:103
+msgid "Incomplete line"
+msgstr "Befejezetlen sor"
+
+#: src/err-codes.h:104
+msgid "Invalid response"
+msgstr "Érvénytelen válasz"
+
+#: src/err-codes.h:105
+msgid "No agent running"
+msgstr "Nincs futó ügynök"
+
+#: src/err-codes.h:106
+#, fuzzy
+#| msgid "agent error"
+msgid "Agent error"
+msgstr "ügynökhiba"
+
+#: src/err-codes.h:107
+msgid "Invalid data"
+msgstr "Érvénytelen adatok"
+
+#: src/err-codes.h:108
+msgid "Unspecific Assuan server fault"
+msgstr "Nem specifikus Assuan kiszolgáló hiba"
+
+#: src/err-codes.h:109
+msgid "General Assuan error"
+msgstr "Ãltalános Assuan hiba"
+
+#: src/err-codes.h:110
+msgid "Invalid session key"
+msgstr "Érvénytelen munkamenet kulcs"
+
+#: src/err-codes.h:111
+msgid "Invalid S-expression"
+msgstr "Érvénytelen S-kifejezés"
+
+#: src/err-codes.h:112
+msgid "Unsupported algorithm"
+msgstr "Nem támogatott algoritmus "
+
+#: src/err-codes.h:113
+msgid "No pinentry"
+msgstr "Nincs pinentry"
+
+#: src/err-codes.h:114
+msgid "pinentry error"
+msgstr "pinentry hiba"
+
+#: src/err-codes.h:115
+msgid "Bad PIN"
+msgstr "Rossz PIN-kód"
+
+#: src/err-codes.h:116
+msgid "Invalid name"
+msgstr "Érvénytelen név"
+
+#: src/err-codes.h:117
+msgid "Bad data"
+msgstr "Rossz adatok"
+
+#: src/err-codes.h:118
+msgid "Invalid parameter"
+msgstr "Érvénytelen paraméter"
+
+#: src/err-codes.h:119
+msgid "Wrong card"
+msgstr "Hibás kártya"
+
+#: src/err-codes.h:120
+msgid "No dirmngr"
+msgstr "Nincs dirmngr"
+
+#: src/err-codes.h:121
+msgid "dirmngr error"
+msgstr "dirmngr hiba"
+
+#: src/err-codes.h:122
+msgid "Certificate revoked"
+msgstr "Tanúsítvány visszavonva"
+
+#: src/err-codes.h:123
+msgid "No CRL known"
+msgstr "Nincs ismert CRL"
+
+#: src/err-codes.h:124
+msgid "CRL too old"
+msgstr "Túl régi CRL"
+
+#: src/err-codes.h:125
+msgid "Line too long"
+msgstr "Túl hosszú sor"
+
+#: src/err-codes.h:126
+msgid "Not trusted"
+msgstr "Nem megbízható"
+
+#: src/err-codes.h:127
+msgid "Operation cancelled"
+msgstr "A művelet megszakítva"
+
+#: src/err-codes.h:128
+msgid "Bad CA certificate"
+msgstr "Rossz CA tanúsítvány"
+
+#: src/err-codes.h:129
+msgid "Certificate expired"
+msgstr "A tanúsítvány lejárt"
+
+#: src/err-codes.h:130
+msgid "Certificate too young"
+msgstr "Túl fiatal tanúsítvány"
+
+#: src/err-codes.h:131
+msgid "Unsupported certificate"
+msgstr "Nem támogatott tanúsítvány"
+
+#: src/err-codes.h:132
+msgid "Unknown S-expression"
+msgstr "Ismeretlen S-kifejezés"
+
+#: src/err-codes.h:133
+msgid "Unsupported protection"
+msgstr "Nem támogatott védelem"
+
+#: src/err-codes.h:134
+msgid "Corrupted protection"
+msgstr "Sérült védelem"
+
+#: src/err-codes.h:135
+msgid "Ambiguous name"
+msgstr "Nem egyértelmű név"
+
+#: src/err-codes.h:136
+msgid "Card error"
+msgstr "Kártyahiba"
+
+#: src/err-codes.h:137
+msgid "Card reset required"
+msgstr "Kártya visszaállítás szükséges"
+
+#: src/err-codes.h:138
+msgid "Card removed"
+msgstr "Kártya eltávolítva"
+
+#: src/err-codes.h:139
+msgid "Invalid card"
+msgstr "Érvénytelen kártya"
+
+#: src/err-codes.h:140
+msgid "Card not present"
+msgstr "A kártya nincs jelen"
+
+#: src/err-codes.h:141
+msgid "No PKCS15 application"
+msgstr "Nincs PKCS15 alkalmazás"
+
+#: src/err-codes.h:142
+msgid "Not confirmed"
+msgstr "Nem megerősített"
+
+#: src/err-codes.h:143
+msgid "Configuration error"
+msgstr "Beállítási hiba"
+
+#: src/err-codes.h:144
+msgid "No policy match"
+msgstr "Nincs egyező házirend"
+
+#: src/err-codes.h:145
+msgid "Invalid index"
+msgstr "Érvénytelen index"
+
+#: src/err-codes.h:146
+msgid "Invalid ID"
+msgstr "Érvénytelen azonosító"
+
+#: src/err-codes.h:147
+msgid "No SmartCard daemon"
+msgstr "Nincs SmartCard démon"
+
+#: src/err-codes.h:148
+msgid "SmartCard daemon error"
+msgstr "SmartCard démon hiba"
+
+#: src/err-codes.h:149
+msgid "Unsupported protocol"
+msgstr "Nem támogatott protokoll"
+
+#: src/err-codes.h:150
+msgid "Bad PIN method"
+msgstr "Rossz PIN-kód módszer"
+
+#: src/err-codes.h:151
+msgid "Card not initialized"
+msgstr "A kártya nincs előkészítve"
+
+#: src/err-codes.h:152
+msgid "Unsupported operation"
+msgstr "Nem támogatott művelet"
+
+#: src/err-codes.h:153
+msgid "Wrong key usage"
+msgstr "Hibás kulcshasználat"
+
+#: src/err-codes.h:154
+msgid "Nothing found"
+msgstr "Semmi sem található"
+
+#: src/err-codes.h:155
+msgid "Wrong blob type"
+msgstr "Hibás blob típus"
+
+#: src/err-codes.h:156
+msgid "Missing value"
+msgstr "Hiányzó érték"
+
+#: src/err-codes.h:157
+msgid "Hardware problem"
+msgstr "Hardverprobléma"
+
+#: src/err-codes.h:158
+msgid "PIN blocked"
+msgstr "PIN-kód blokkolva"
+
+#: src/err-codes.h:159
+msgid "Conditions of use not satisfied"
+msgstr "A használati feltételek nem teljesülnek"
+
+#: src/err-codes.h:160
+msgid "PINs are not synced"
+msgstr "A PIN-kódok nincsenek szinkronizálva"
+
+#: src/err-codes.h:161
+msgid "Invalid CRL"
+msgstr "Érvénytelen CRL"
+
+#: src/err-codes.h:162
+msgid "BER error"
+msgstr "BER hiba"
+
+#: src/err-codes.h:163
+msgid "Invalid BER"
+msgstr "Érvénytelen BER"
+
+#: src/err-codes.h:164
+msgid "Element not found"
+msgstr "Az elem nem található"
+
+#: src/err-codes.h:165
+msgid "Identifier not found"
+msgstr "Az azonosító nem található"
+
+#: src/err-codes.h:166
+msgid "Invalid tag"
+msgstr "Érvénytelen címke"
+
+#: src/err-codes.h:167
+msgid "Invalid length"
+msgstr "Érvénytelen hossz"
+
+#: src/err-codes.h:168
+msgid "Invalid key info"
+msgstr "Érvénytelen kulcsinformációk"
+
+#: src/err-codes.h:169
+msgid "Unexpected tag"
+msgstr "Váratlan címke"
+
+#: src/err-codes.h:170
+msgid "Not DER encoded"
+msgstr "Nem DER kódolású"
+
+#: src/err-codes.h:171
+msgid "No CMS object"
+msgstr "Nincs CMS objektum"
+
+#: src/err-codes.h:172
+msgid "Invalid CMS object"
+msgstr "Érvénytelen CMS objektum"
+
+#: src/err-codes.h:173
+msgid "Unknown CMS object"
+msgstr "Ismeretlen CMS objektum"
+
+#: src/err-codes.h:174
+msgid "Unsupported CMS object"
+msgstr "Nem támogatott CMS objektum"
+
+#: src/err-codes.h:175
+msgid "Unsupported encoding"
+msgstr "Nem támogatott kódolás"
+
+#: src/err-codes.h:176
+msgid "Unsupported CMS version"
+msgstr "Nem támogatott CMS verzió"
+
+#: src/err-codes.h:177
+msgid "Unknown algorithm"
+msgstr "Ismeretlen algoritmus"
+
+#: src/err-codes.h:178
+msgid "Invalid crypto engine"
+msgstr "Érvénytelen titkosítási motor"
+
+#: src/err-codes.h:179
+msgid "Public key not trusted"
+msgstr "A nyilvános kulcs nem megbízható"
+
+#: src/err-codes.h:180
+msgid "Decryption failed"
+msgstr "Visszafejtés sikertelen"
+
+#: src/err-codes.h:181
+msgid "Key expired"
+msgstr "A kulcs lejárt"
+
+#: src/err-codes.h:182
+msgid "Signature expired"
+msgstr "Az aláírás lejárt"
+
+#: src/err-codes.h:183
+msgid "Encoding problem"
+msgstr "Kódolási probléma"
+
+#: src/err-codes.h:184
+msgid "Invalid state"
+msgstr "Érvénytelen állapot"
+
+#: src/err-codes.h:185
+msgid "Duplicated value"
+msgstr "Kettőzött érték"
+
+#: src/err-codes.h:186
+msgid "Missing action"
+msgstr "Hiányzó művelet"
+
+#: src/err-codes.h:187
+msgid "ASN.1 module not found"
+msgstr "Nem található ASN.1 modul"
+
+#: src/err-codes.h:188
+msgid "Invalid OID string"
+msgstr "Érvénytelen OID karakterlánc"
+
+#: src/err-codes.h:189
+msgid "Invalid time"
+msgstr "Érvénytelen időpont"
+
+#: src/err-codes.h:190
+msgid "Invalid CRL object"
+msgstr "Érvénytelen CRL objektum"
+
+#: src/err-codes.h:191
+msgid "Unsupported CRL version"
+msgstr "Nem támogatott CRL verzió"
+
+#: src/err-codes.h:192
+msgid "Invalid certificate object"
+msgstr "Érvénytelen tanúsítványobjektum"
+
+#: src/err-codes.h:193
+msgid "Unknown name"
+msgstr "Ismeretlen név"
+
+#: src/err-codes.h:194
+msgid "A locale function failed"
+msgstr "Egy területi beállítás függvény meghiúsult"
+
+#: src/err-codes.h:195
+msgid "Not locked"
+msgstr "Nincs zárolva"
+
+#: src/err-codes.h:196
+msgid "Protocol violation"
+msgstr "Protokollsértés"
+
+#: src/err-codes.h:197
+msgid "Invalid MAC"
+msgstr "Érvénytelen MAC"
+
+#: src/err-codes.h:198
+msgid "Invalid request"
+msgstr "Érvénytelen kérés"
+
+#: src/err-codes.h:199
+msgid "Unknown extension"
+msgstr "Ismeretlen kiterjesztés"
+
+#: src/err-codes.h:200
+msgid "Unknown critical extension"
+msgstr "Ismeretlen kritikus kiterjesztés"
+
+#: src/err-codes.h:201
+msgid "Locked"
+msgstr "Zárolva"
+
+#: src/err-codes.h:202
+msgid "Unknown option"
+msgstr "Ismeretlen kapcsoló"
+
+#: src/err-codes.h:203
+msgid "Unknown command"
+msgstr "Ismeretlen parancs"
+
+#: src/err-codes.h:204
+msgid "Not operational"
+msgstr "Nem működik"
+
+#: src/err-codes.h:205
+msgid "No passphrase given"
+msgstr "Nincs jelmondat megadva"
+
+#: src/err-codes.h:206
+msgid "No PIN given"
+msgstr "Nincs PIN-kód megadva"
+
+#: src/err-codes.h:207
+#, fuzzy
+#| msgid "Not locked"
+msgid "Not enabled"
+msgstr "Nincs zárolva"
+
+#: src/err-codes.h:208
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "No crypto engine"
+msgstr "Érvénytelen titkosítási motor"
+
+#: src/err-codes.h:209
+#, fuzzy
+#| msgid "Missing value"
+msgid "Missing key"
+msgstr "Hiányzó érték"
+
+#: src/err-codes.h:210
+#, fuzzy
+#| msgid "No CMS object"
+msgid "Too many objects"
+msgstr "Nincs CMS objektum"
+
+#: src/err-codes.h:211
+msgid "Limit reached"
+msgstr ""
+
+#: src/err-codes.h:212
+#, fuzzy
+#| msgid "Card not initialized"
+msgid "Not initialized"
+msgstr "A kártya nincs előkészítve"
+
+#: src/err-codes.h:213
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing issuer certificate"
+msgstr "Hiányzó tanúsítvány"
+
+#: src/err-codes.h:214
+msgid "No keyserver available"
+msgstr ""
+
+#: src/err-codes.h:215
+#, fuzzy
+#| msgid "Invalid time"
+msgid "Invalid elliptic curve"
+msgstr "Érvénytelen időpont"
+
+#: src/err-codes.h:216
+#, fuzzy
+#| msgid "Unknown source"
+msgid "Unknown elliptic curve"
+msgstr "Ismeretlen forrás"
+
+#: src/err-codes.h:217
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated key"
+msgstr "Kettőzött érték"
+
+#: src/err-codes.h:218
+#, fuzzy
+#| msgid "Ambiguous name"
+msgid "Ambiguous result"
+msgstr "Nem egyértelmű név"
+
+#: src/err-codes.h:219
+msgid "No crypto context"
+msgstr ""
+
+#: src/err-codes.h:220
+msgid "Wrong crypto context"
+msgstr ""
+
+#: src/err-codes.h:221
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "Bad crypto context"
+msgstr "Érvénytelen titkosítási motor"
+
+#: src/err-codes.h:222
+msgid "Conflict in the crypto context"
+msgstr ""
+
+#: src/err-codes.h:223
+#, fuzzy
+#| msgid "No public key"
+msgid "Broken public key"
+msgstr "Nincs nyilvános kulcs"
+
+#: src/err-codes.h:224
+#, fuzzy
+#| msgid "No secret key"
+msgid "Broken secret key"
+msgstr "Nincs titkos kulcs"
+
+#: src/err-codes.h:225
+#, fuzzy
+#| msgid "Invalid digest algorithm"
+msgid "Invalid MAC algorithm"
+msgstr "Érvénytelen kivonat algoritmus"
+
+#: src/err-codes.h:226
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "Operation fully cancelled"
+msgstr "A művelet megszakítva"
+
+#: src/err-codes.h:227
+msgid "Operation not yet finished"
+msgstr "A művelet még nem fejeződött be"
+
+#: src/err-codes.h:228
+msgid "Buffer too short"
+msgstr "Túl rövid puffer"
+
+#: src/err-codes.h:229
+msgid "Invalid length specifier in S-expression"
+msgstr "Érvénytelen hosszmegadó az S-kifejezésben"
+
+#: src/err-codes.h:230
+msgid "String too long in S-expression"
+msgstr "Túl hosszú karakterlánc az S-kifejezésben"
+
+#: src/err-codes.h:231
+msgid "Unmatched parentheses in S-expression"
+msgstr "Lezáratlan zárójelek az S-kifejezésben"
+
+#: src/err-codes.h:232
+msgid "S-expression not canonical"
+msgstr "Az S-kifejezés nem hitelesnek elismert"
+
+#: src/err-codes.h:233
+msgid "Bad character in S-expression"
+msgstr "Rossz karakter az S-kifejezésben"
+
+#: src/err-codes.h:234
+msgid "Bad quotation in S-expression"
+msgstr "Rossz idézés az S-kifejezésben"
+
+#: src/err-codes.h:235
+msgid "Zero prefix in S-expression"
+msgstr "Nulla előtag az S-kifejezésben"
+
+#: src/err-codes.h:236
+msgid "Nested display hints in S-expression"
+msgstr "Beágyazott megjelenítési tippek az S-kifejezésben"
+
+#: src/err-codes.h:237
+msgid "Unmatched display hints"
+msgstr "Nem egyező megjelenítési tippek"
+
+#: src/err-codes.h:238
+msgid "Unexpected reserved punctuation in S-expression"
+msgstr "Váratlan fenntartott központozás az S-kifejezésben"
+
+#: src/err-codes.h:239
+msgid "Bad hexadecimal character in S-expression"
+msgstr "Rossz hexadecimális karakter az S-kifejezésben"
+
+#: src/err-codes.h:240
+msgid "Odd hexadecimal numbers in S-expression"
+msgstr "Páratlan hexadecimális számok az S-kifejezésben"
+
+#: src/err-codes.h:241
+#, fuzzy
+#| msgid "Bad octadecimal character in S-expression"
+msgid "Bad octal character in S-expression"
+msgstr "Rossz oktadecimális karakter az S-kifejezésben"
+
+#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr ""
+
+#: src/err-codes.h:243
+#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Az adatok nincsenek titkosítva"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Ismeretlen név"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Nincs nyilvános kulcs"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Túl rövid puffer"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Túl hosszú sor"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "Rossz tanúsítványlánc"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Túl fiatal tanúsítvány"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "Érvénytelen kártya"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Váratlan címke"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "Érvénytelen titkosító algoritmus"
+
+#: src/err-codes.h:260
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing client certificate"
+msgstr "Hiányzó tanúsítvány"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Tanúsítvány visszavonva"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "A kulcs lejárt"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "Rossz nyilvános kulcs"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Ismeretlen csomag"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "Rossz tanúsítványlánc"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "A kulcs lejárt"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
+#| msgid "Invalid object"
+msgid "Invalid lock object"
+msgstr "Érvénytelen objektum"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "Ãltalános IPC hiba"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "Az IPC elfogadási hívás meghiúsult"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "Az IPC kapcsolódási hívás meghiúsult"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "Érvénytelen IPC válasz"
+
+#: src/err-codes.h:286
+msgid "Invalid value passed to IPC"
+msgstr "Érvénytelen érték került átadásra az IPC-nek"
+
+#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr "Befejezetlen sor került átadásra az IPC-nek"
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr "Az IPC-nek átadott sor túl hosszú"
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr "Beágyazott IPC parancsok"
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr "Nincs adatvisszahívás az IPC-ben"
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr "Nincs érdeklődés visszahívás az IPC-ben"
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr "Nem IPC kiszolgáló"
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr "Nem IPC kliens"
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr "Probléma adódott az IPC kiszolgáló indításakor"
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr "IPC olvasási hiba"
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr "IPC írási hiba"
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr "Túl sok adat az IPC réteghez"
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr "Váratlan IPC parancs"
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr "Ismeretlen IPC parancs"
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr "IPC szintaktikai hiba"
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr "Az IPC hívás megszakításra került"
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr "Nincs bemeneti forrás az IPC-hez"
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr "Nincs kimeneti forrás az IPC-hez"
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr "IPC paraméterhiba"
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr "Ismeretlen IPC érdeklődés"
+
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "Crypto engine too old"
+msgstr "Érvénytelen titkosítási motor"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Kettőzött érték"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Túl fiatal tanúsítvány"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "A megadott objektum túl kicsi"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Ismeretlen név"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Érvénytelen műveletkód"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Ismeretlen név"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Ismeretlen rendszerhiba"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Érvénytelen OID karakterlánc"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Érvénytelen S-kifejezés"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing DNS query packet"
+msgstr "Hiányzó tanúsítvány"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Visszafejtés sikertelen"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Időtúllépés"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Ãltalános IPC hiba"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Ãltalános Assuan hiba"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Ãltalános Assuan hiba"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC írási hiba"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Ãltalános IPC hiba"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Az IPC kapcsolódási hívás meghiúsult"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Kártya visszaállítás szükséges"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Az elem nem található"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Nem támogatott"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Váratlan hiba"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Nem támogatott művelet"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Rossz tanúsítvány"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Ismeretlen kiterjesztés"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Időtúllépés"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "dirmngr hiba"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "dirmngr hiba"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC olvasási hiba"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Nem IPC kiszolgáló"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Sikeres"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Beállítási hiba"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Protokollsértés"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Ismeretlen kiterjesztés"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Ãltalános hiba"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Kártya visszaállítás szükséges"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Érvénytelen attribútum"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Nem támogatott védelem"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Protokollsértés"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Érvénytelen állapot"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Nincs CMS objektum"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Hardverprobléma"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Érvénytelen állapot"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Kódolási probléma"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Nem támogatott védelem"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Érvénytelen kártya"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Hiányzó művelet"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Protokollsértés"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "A művelet még nem fejeződött be"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "A művelet megszakítva"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Túl hosszú sor"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "A művelet megszakítva"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Ãltalános IPC hiba"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Az erőforrások kimerültek"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Protokollsértés"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Érvénytelen állapot"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Nem támogatott tanúsítvány"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Kártya visszaállítás szükséges"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Sikeres"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Nem működik"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Nem működik"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Nem IPC kiszolgáló"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Visszafejtés sikertelen"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr "1. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr "2. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr "3. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr "4. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr "5. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr "6. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr "7. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr "8. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr "9. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr "10. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr "11. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr "12. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr "13. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr "14. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr "15. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr "16. felhasználó által megadott hibakód"
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr "Rendszerhiba w/o hibaszám"
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr "Ismeretlen rendszerhiba"
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr "Fájl vége"
+
+#: src/err-codes.h:429
+msgid "Unknown error code"
+msgstr "Ismeretlen hibakód"
+
+#: src/gpg-error.c:450
+#, c-format
+msgid "Usage: %s GPG-ERROR [...]\n"
+msgstr "Használat: %s GPG-ERROR […]\n"
+
+#: src/gpg-error.c:633
+#, c-format
+msgid "%s: warning: could not recognize %s\n"
+msgstr "%s: figyelmeztetés: nem sikerült felismerni: %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Az erőforrások kimerültek"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Érvénytelen adatok"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Ãltalános hiba"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "dirmngr hiba"
diff --git a/po/it.gmo b/po/it.gmo
index f91078b..7653cfb 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index b4ce99d..a7b24a1 100644
--- a/po/it.po
+++ b/po/it.po
@@ -1,15 +1,16 @@
# Italian messages for libgpg-error.
-# Copyright (C) 2009 Free Software Foundation, Inc.
+# Copyright (C) 2009, 2014 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
# Francesco Groccia <francesco.groccia@poste.it>, 2009.
+# Milo Casagrande <milo@milo.name>, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error 1.7\n"
+"Project-Id-Version: libgpg-error\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:09+0100\n"
-"Last-Translator: Francesco Groccia <francesco.groccia@poste.it>\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-17 09:06+0100\n"
+"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
@@ -74,33 +75,37 @@ msgstr "Kleopatra"
#: src/err-sources.h:42
msgid "G13"
-msgstr ""
+msgstr "G13"
#: src/err-sources.h:43
msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Qualsiasi fonte"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Fonte 1 definita dall'utente"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Fonte 2 definita dall'utente"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Fonte 3 definita dall'utente"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Fonte 4 definita dall'utente"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Fonte sconosciuta"
@@ -157,7 +162,7 @@ msgid "Invalid cipher algorithm"
msgstr "Algoritmo di cifratura non valido"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Apertura del portachiavi"
#: src/err-codes.h:42
@@ -417,10 +422,8 @@ msgid "No agent running"
msgstr "Nessun agente in esecuzione"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
-msgstr "errore dell'agente"
+msgstr "Errore dell'agente"
#: src/err-codes.h:107
msgid "Invalid data"
@@ -823,118 +826,84 @@ msgid "No PIN given"
msgstr "Nessun PIN fornito"
#: src/err-codes.h:207
-#, fuzzy
-#| msgid "Not locked"
msgid "Not enabled"
-msgstr "Non bloccato"
+msgstr "Disabilitato"
#: src/err-codes.h:208
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "No crypto engine"
-msgstr "Motore crittografico non valido"
+msgstr "Nessun motore di cifratura"
#: src/err-codes.h:209
-#, fuzzy
-#| msgid "Missing value"
msgid "Missing key"
-msgstr "Valore assente"
+msgstr "Chiave mancate"
#: src/err-codes.h:210
-#, fuzzy
-#| msgid "No CMS object"
msgid "Too many objects"
-msgstr "Non esiste alcun oggetto CMS"
+msgstr "Troppi oggetti"
#: src/err-codes.h:211
msgid "Limit reached"
-msgstr ""
+msgstr "Raggiunto limite"
#: src/err-codes.h:212
-#, fuzzy
-#| msgid "Card not initialized"
msgid "Not initialized"
-msgstr "La scheda non è stata inizializzata"
+msgstr "Non inizializzato"
#: src/err-codes.h:213
-#, fuzzy
-#| msgid "Missing certificate"
msgid "Missing issuer certificate"
-msgstr "Certificato mancante"
+msgstr "Manca il certificato dell'emittente"
#: src/err-codes.h:214
msgid "No keyserver available"
-msgstr ""
+msgstr "Nessun server di chiavi disponibile"
#: src/err-codes.h:215
-#, fuzzy
-#| msgid "Invalid time"
msgid "Invalid elliptic curve"
-msgstr "Data non valida"
+msgstr "Curva ellittica non valida"
#: src/err-codes.h:216
-#, fuzzy
-#| msgid "Unknown source"
msgid "Unknown elliptic curve"
-msgstr "Fonte sconosciuta"
+msgstr "Curva ellittica sconosciuta"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Valore duplicato"
+msgstr "Chiave duplicata"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "Nome ambiguo"
+msgstr "Risultato ambiguo"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "No crypto context"
-msgstr "Motore crittografico non valido"
+msgstr "Nessun contesto di cifratura"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Wrong crypto context"
-msgstr "Motore crittografico non valido"
+msgstr "Contesto di cifratura errato"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Motore crittografico non valido"
+msgstr "Contesto di cifratura rovinato"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Conflitto nel contesto di cifratura"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Nessuna chiave pubblica"
+msgstr "Chiave pubblica danneggiata"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Nessuna chiave segreta"
+msgstr "Chiave segreta danneggiata"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Algoritmo di digest non valido"
+msgstr "Algoritmo MAC non valido"
#: src/err-codes.h:226
-#, fuzzy
-#| msgid "Operation cancelled"
msgid "Operation fully cancelled"
-msgstr "Operazione annullata"
+msgstr "Operazione annullata completamente"
#: src/err-codes.h:227
msgid "Operation not yet finished"
@@ -993,203 +962,937 @@ msgid "Odd hexadecimal numbers in S-expression"
msgstr "Numeri esadecimali dispari in S-expression"
#: src/err-codes.h:241
-#, fuzzy
-#| msgid "Bad octadecimal character in S-expression"
msgid "Bad octal character in S-expression"
msgstr "Carattere ottale errato in S-expression"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Oggetto non valido"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Dati non cifrati"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Nome sconosciuto"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Nessuna chiave pubblica"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffer troppo breve"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Riga troppo lunga"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Nessuna catena di certificazione"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Il certificato è troppo grande"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Record non valido"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "Impossibile verificare il MAC"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Messaggio inaspettato"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Compressione o estrazione non riuscita"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Un contatore si azzererebbe (troppi messaggi...)"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Ricevuto un messaggio di avviso fatale"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Nessun algoritmo di cifratura"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Certificato client mancante"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Ricevuta notifica di chiusura"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Ticket scaduto"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Ticket errato"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Identità sconosciuta"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Messaggio del certificato errato nell'handshake"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Messaggio di richiesta del certificato errato nell'handshake"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Messaggio di verifica del certificato errato nell'handshake"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Messaggi di modifica cifrario errato nell'handshake"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Messaggio client hello errato nell'handshake"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Messaggio server hello errato nell'handshake"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Messaggio server hello completato errato nell'handshake"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Messaggio completato errato nell'handshake"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Messaggio server scambio di chiavi errato nell'handshake"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Messaggio client scambio di chiavi errato nell'handshake"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Stringa fasulla"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Chiave disabilitata"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Non possibile con una chiave su scheda"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Oggetto di blocco non valido"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Errore IPC generale"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Chiamata \"accept\" IPC non riuscita"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Chiamata \"connect\" IPC non riuscita"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Risposta IPC non valida"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Valore non valido passato a IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Riga incompleta passata a IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Riga passata a IPC troppo lunga"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Comandi IPC nidificati"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Nessun callback \"data\" in IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Nessun callback \"inquire\" in IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Non è un server IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Non è un client IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problema nell'avviare il server IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
-msgstr "errore di lettura IPC"
+msgstr "Errore di lettura IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
-msgstr "errore di scrittura IPC"
+msgstr "Errore di scrittura IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Troppi dati per il livello IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Comando IPC inaspettato"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Comando IPC sconosciuto"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
-msgstr "errore di sintassi IPC"
+msgstr "Errore di sintassi IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "La chiamata IPC è stata annullata"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Nessuna sorgente in entrata per IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Nessuna sorgente in uscita per IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Errore per il parametro IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Richiesta IPC sconosciuta"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Nessun motore di cifratura"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Valore duplicato"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certificato troppo nuovo"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "L'oggetto fornito è troppo piccolo"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nome sconosciuto"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Codice di operazione non valido"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Nome sconosciuto"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Errore di sistema sconosciuto"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Testo per l'OID non valido"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "S-expression non valida"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Manca il certificato dell'emittente"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Decifratura non riuscita"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tempo scaduto"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Errore IPC generale"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Errore generale"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Errore generale"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Errore generale per Assuan"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Errore generale"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Errore generale per Assuan"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Errore di scrittura IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Errore IPC generale"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Chiamata \"connect\" IPC non riuscita"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Errore generale"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "È richiesto il riavvio della scheda"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Elemento non trovato"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Non supportato"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Errore inaspettato"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Operazione non supportata"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Certificato errato"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Estensione sconosciuta"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tempo scaduto"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "Errore di dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "Errore di dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Errore di lettura IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Non è un server IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Eseguito"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Errore di configurazione"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Violazione del protocollo"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Estensione sconosciuta"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Ricevuto un messaggio di avviso fatale"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Errore generale"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "È richiesto il riavvio della scheda"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Attributo non valido"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Protezione non supportata"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Violazione del protocollo"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Stato non valido"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Non esiste alcun oggetto CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Problema hardware"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Stato non valido"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Problema nella codifica"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Protezione non supportata"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Scheda non valida"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Nessun server di chiavi disponibile"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Azione mancante"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Violazione del protocollo"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Operazione non ancora terminata"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operazione annullata"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Riga troppo lunga"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operazione annullata"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Errore IPC generale"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Risorse esaurite"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Violazione del protocollo"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Stato non valido"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Certificato non supportato"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "È richiesto il riavvio della scheda"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Eseguito"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Non è in funzione"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Non è in funzione"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Non è un server IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Decifratura non riuscita"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Codice errore 1 definito dall'utente"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Codice errore 2 definito dall'utente"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Codice errore 3 definito dall'utente"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Codice errore 4 definito dall'utente"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Codice errore 5 definito dall'utente"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Codice errore 6 definito dall'utente"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Codice errore 7 definito dall'utente"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Codice errore 8 definito dall'utente"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Codice errore 9 definito dall'utente"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Codice errore 10 definito dall'utente"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Codice errore 11 definito dall'utente"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Codice errore 12 definito dall'utente"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Codice errore 13 definito dall'utente"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Codice errore 14 definito dall'utente"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Codice errore 15 definito dall'utente"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Codice errore 16 definito dall'utente"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Errore di sistema senza errno"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Errore di sistema sconosciuto"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Fine del file"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Codice di errore sconosciuto"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Uso: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: avviso: impossibile riconoscere %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Risorse esaurite"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Dati non validi"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Errore generale"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "Errore di dirmngr"
diff --git a/po/ja.gmo b/po/ja.gmo
index 99f18cb..6921498 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index aaadb05..1b9d9dd 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,16 +1,17 @@
# Japanese messages for GnuPG libgpg-error
-# Copyright (C) 2010, 2012 Free Software Foundation, Inc.
+# Copyright (C) 2010, 2012, 2014, 2015, 2016 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
# Yasuaki Taniguchi <yasuakit@gmail.com>, 2010.
# Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2012.
+# NIIBE Yutaka <gniibe@fsij.org>, 2014, 2015, 2016.
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error 1.7\n"
+"Project-Id-Version: libgpg-error 1.26\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:09+0100\n"
-"Last-Translator: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>\n"
-"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2016-12-22 08:12+0900\n"
+"Last-Translator: NIIBE Yutaka <gniibe@fsij.org>\n"
+"Language-Team: none\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -39,7 +40,7 @@ msgstr "GPG Agent"
#: src/err-sources.h:33
msgid "Pinentry"
-msgstr "PIN 入力"
+msgstr "Pinentry"
#: src/err-sources.h:34
msgid "SCD"
@@ -75,35 +76,39 @@ msgstr "Kleopatra"
#: src/err-sources.h:42
msgid "G13"
-msgstr ""
+msgstr "G13"
#: src/err-sources.h:43
msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
-msgid "Any source"
-msgstr "å…¨ã¦ã®ã‚½ãƒ¼ã‚¹"
+msgid "TLS"
+msgstr "TLS"
#: src/err-sources.h:45
+msgid "Any source"
+msgstr "指定ãªã—ã®ã‚½ãƒ¼ã‚¹"
+
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "ユーザ定義ソース 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "ユーザ定義ソース 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "ユーザ定義ソース 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "ユーザ定義ソース 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
-msgstr "ä¸æ˜Žãªã‚½ãƒ¼ã‚¹ã§ã™"
+msgstr "ä¸æ˜Žãªã‚½ãƒ¼ã‚¹"
#: src/err-codes.h:28
msgid "Success"
@@ -111,7 +116,7 @@ msgstr "æˆåŠŸã§ã™"
#: src/err-codes.h:29
msgid "General error"
-msgstr "一般的ãªã‚¨ãƒ©ãƒ¼ã§ã™"
+msgstr "一般エラーã§ã™"
#: src/err-codes.h:30
msgid "Unknown packet"
@@ -119,7 +124,7 @@ msgstr "ä¸æ˜Žãªãƒ‘ケットã§ã™"
#: src/err-codes.h:31
msgid "Unknown version in packet"
-msgstr "パケット内ã§ä¸æ˜Žãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™"
+msgstr "パケット内ã®ä¸æ˜Žãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™"
#: src/err-codes.h:32
msgid "Invalid public key algorithm"
@@ -127,7 +132,7 @@ msgstr "無効ãªå…¬é–‹éµã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã™"
#: src/err-codes.h:33
msgid "Invalid digest algorithm"
-msgstr "無効ãªè¦ç´„アルゴリズムã§ã™"
+msgstr "無効ãªãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆãƒ»ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã™"
#: src/err-codes.h:34
msgid "Bad public key"
@@ -158,8 +163,8 @@ msgid "Invalid cipher algorithm"
msgstr "無効ãªæš—å·ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã™"
#: src/err-codes.h:41
-msgid "Keyring open"
-msgstr "éµãƒªãƒ³ã‚°ã‚ªãƒ¼ãƒ—ン"
+msgid "Cannot open keyring"
+msgstr ""
#: src/err-codes.h:42
msgid "Invalid packet"
@@ -167,7 +172,7 @@ msgstr "無効ãªãƒ‘ケットã§ã™"
#: src/err-codes.h:43
msgid "Invalid armor"
-msgstr "無効ãªã‚¢ã‚¹ã‚­ãƒ¼å½¢å¼ã§ã™"
+msgstr "無効ãªã‚¢ã‚¹ã‚­ãƒ¼ä¿è­·å½¢å¼ã§ã™"
#: src/err-codes.h:44
msgid "No user ID"
@@ -191,7 +196,7 @@ msgstr "ä¸æ˜Žãªåœ§ç¸®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã™"
#: src/err-codes.h:49
msgid "Number is not prime"
-msgstr "数値ãŒç´ æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "æ•°ãŒç´ æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:50
msgid "Invalid encoding method"
@@ -223,19 +228,19 @@ msgstr "値ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:57
msgid "Syntax error"
-msgstr "構文エラー"
+msgstr "構文エラーã§ã™"
#: src/err-codes.h:58
msgid "Bad MPI value"
-msgstr "誤ã£ãŸ MPI ã®å€¤"
+msgstr "誤ã£ãŸ MPI ã®å€¤ã§ã™"
#: src/err-codes.h:59
msgid "Invalid passphrase"
-msgstr "無効ãªãƒ‘スフレーズ"
+msgstr "無効ãªãƒ‘スフレーズã§ã™"
#: src/err-codes.h:60
msgid "Invalid signature class"
-msgstr "無効ãªç½²åクラス"
+msgstr "無効ãªç½²åクラスã§ã™"
#: src/err-codes.h:61
msgid "Resources exhausted"
@@ -243,11 +248,11 @@ msgstr "資æºã‚’使ã„æžœãŸã—ã¾ã—ãŸ"
#: src/err-codes.h:62
msgid "Invalid keyring"
-msgstr "無効ãªéµãƒªãƒ³ã‚°"
+msgstr "無効ãªéµãƒªãƒ³ã‚°ã§ã™"
#: src/err-codes.h:63
msgid "Trust DB error"
-msgstr "信用 DB エラー"
+msgstr "信用 DB エラーã§ã™"
#: src/err-codes.h:64
msgid "Bad certificate"
@@ -263,7 +268,7 @@ msgstr "予期ã—ãªã„エラーã§ã™"
#: src/err-codes.h:67
msgid "Time conflict"
-msgstr "時間ã®ç«¶åˆã§ã™"
+msgstr "時間ã®ä¸ä¸€è‡´ã§ã™"
#: src/err-codes.h:68
msgid "Keyserver error"
@@ -274,9 +279,8 @@ msgid "Wrong public key algorithm"
msgstr "誤ã£ãŸå…¬é–‹éµã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã™"
#: src/err-codes.h:70
-#, fuzzy
msgid "Tribute to D. A."
-msgstr " コピー"
+msgstr "ダグラス・アダムスã«æ§ã"
#: src/err-codes.h:71
msgid "Weak encryption key"
@@ -292,7 +296,7 @@ msgstr "無効ãªå¼•æ•°ã§ã™"
#: src/err-codes.h:74
msgid "Syntax error in URI"
-msgstr "URI ã§æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ã§ã™"
+msgstr "URIã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ã§ã™"
#: src/err-codes.h:75
msgid "Invalid URI"
@@ -308,7 +312,7 @@ msgstr "ä¸æ˜Žãªãƒ›ã‚¹ãƒˆã§ã™"
#: src/err-codes.h:78
msgid "Selftest failed"
-msgstr "自己試験ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgstr "セルフテストã«å¤±æ•—ã—ã¾ã—ãŸ"
#: src/err-codes.h:79
msgid "Data not encrypted"
@@ -336,7 +340,7 @@ msgstr "誤ã£ãŸè¨¼æ˜Žæ›¸é€£éŽ–ã§ã™"
#: src/err-codes.h:85
msgid "Missing certificate"
-msgstr "証明書ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "証明書ãŒæ¬ å¦‚ã—ã¦ã„ã¾ã™"
#: src/err-codes.h:86
msgid "No data"
@@ -344,7 +348,7 @@ msgstr "データãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:87
msgid "Bug"
-msgstr "ãƒã‚°"
+msgstr "ãƒã‚°ã§ã™"
#: src/err-codes.h:88
msgid "Not supported"
@@ -356,19 +360,19 @@ msgstr "無効ãªæ“作コードã§ã™"
#: src/err-codes.h:90
msgid "Timeout"
-msgstr "タイムアウト"
+msgstr "タイムアウトã§ã™"
#: src/err-codes.h:91
msgid "Internal error"
-msgstr "内部エラー"
+msgstr "内部エラーã§ã™"
#: src/err-codes.h:92
msgid "EOF (gcrypt)"
-msgstr "EOF (gcrypt)"
+msgstr "EOF (gcrypt)ã§ã™"
#: src/err-codes.h:93
msgid "Invalid object"
-msgstr "無効ãªã‚ªãƒ–ジェクト"
+msgstr "無効ãªã‚ªãƒ–ジェクトã§ã™"
#: src/err-codes.h:94
msgid "Provided object is too short"
@@ -380,16 +384,15 @@ msgstr "与ãˆã‚‰ã‚ŒãŸã‚ªãƒ–ジェクトãŒå¤§ãã™ãŽã¾ã™"
#: src/err-codes.h:96
msgid "Missing item in object"
-msgstr "オブジェクト内ã«é …ç›®ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "オブジェクト内ã«é …ç›®ãŒæ¬ å¦‚ã—ã¦ã„ã¾ã™"
#: src/err-codes.h:97
msgid "Not implemented"
msgstr "実装ã•ã‚Œã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:98
-#, fuzzy
msgid "Conflicting use"
-msgstr "一貫ã—ã¦ã„ãªã„ #~ ã®ä½¿ç”¨"
+msgstr "対立ã™ã‚‹ä½¿ç”¨ã§ã™"
#: src/err-codes.h:99
msgid "Invalid cipher mode"
@@ -409,7 +412,7 @@ msgstr "çµæžœãŒåˆ‡ã‚Šè©°ã‚られã¾ã—ãŸ"
#: src/err-codes.h:103
msgid "Incomplete line"
-msgstr "完全ã§ãªã„è¡Œã§ã™"
+msgstr "ä¸å®Œå…¨ãªè¡Œã§ã™"
#: src/err-codes.h:104
msgid "Invalid response"
@@ -417,11 +420,9 @@ msgstr "無効ãªå¿œç­”ã§ã™"
#: src/err-codes.h:105
msgid "No agent running"
-msgstr "エージェントãŒå®Ÿè¡Œã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "エージェントãŒå‹•ã„ã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
msgstr "エージェントエラーã§ã™"
@@ -435,7 +436,7 @@ msgstr "ä¸ç‰¹å®šãª Assuan サーãƒå¤±æ•—ã§ã™"
#: src/err-codes.h:109
msgid "General Assuan error"
-msgstr "一般的㪠Assuan エラーã§ã™"
+msgstr "一般Assuan エラーã§ã™"
#: src/err-codes.h:110
msgid "Invalid session key"
@@ -451,11 +452,11 @@ msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„アルゴリズムã§ã™"
#: src/err-codes.h:113
msgid "No pinentry"
-msgstr "PIN 入力ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "PinentryãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:114
msgid "pinentry error"
-msgstr "PIN 入力エラー"
+msgstr "Pinentryエラー"
#: src/err-codes.h:115
msgid "Bad PIN"
@@ -478,18 +479,16 @@ msgid "Wrong card"
msgstr "誤ã£ãŸã‚«ãƒ¼ãƒ‰ã§ã™"
#: src/err-codes.h:120
-#, fuzzy
msgid "No dirmngr"
-msgstr "- < 翻訳ãŒã‚ã‚Šã¾ã›ã‚“ >"
+msgstr "dirmngrãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:121
-#, fuzzy
msgid "dirmngr error"
-msgstr "%s サブプロセス入出力エラー"
+msgstr "dirmngr ã®ã‚¨ãƒ©ãƒ¼"
#: src/err-codes.h:122
msgid "Certificate revoked"
-msgstr "証明書ãŒç ´æ£„ã•ã‚Œã¾ã—ãŸ"
+msgstr "証明書ãŒå»ƒæ­¢ã•ã‚Œã¾ã—ãŸ"
#: src/err-codes.h:123
msgid "No CRL known"
@@ -565,7 +564,7 @@ msgstr "カードãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:141
msgid "No PKCS15 application"
-msgstr "PKCS15 アプリケーションã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "PKCS15 アプリケーションãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:142
msgid "Not confirmed"
@@ -629,7 +628,7 @@ msgstr "値ãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:157
msgid "Hardware problem"
-msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢å•é¡Œã§ã™"
+msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®å•é¡Œã§ã™"
#: src/err-codes.h:158
msgid "PIN blocked"
@@ -717,7 +716,7 @@ msgstr "無効ãªæš—å·ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™"
#: src/err-codes.h:179
msgid "Public key not trusted"
-msgstr "信用ã—ã¦ã„ãªã„公開éµã§ã™"
+msgstr "信用ã•ã‚Œã¦ã„ãªã„公開éµã§ã™"
#: src/err-codes.h:180
msgid "Decryption failed"
@@ -744,9 +743,8 @@ msgid "Duplicated value"
msgstr "é‡è¤‡ã—ãŸå€¤ã§ã™"
#: src/err-codes.h:186
-#, fuzzy
msgid "Missing action"
-msgstr "何もã—ãªã„"
+msgstr "アクションãŒæ¬ å¦‚ã—ã¦ã„ã¾ã™"
#: src/err-codes.h:187
msgid "ASN.1 module not found"
@@ -790,7 +788,7 @@ msgstr "プロトコルé•å"
#: src/err-codes.h:197
msgid "Invalid MAC"
-msgstr "無効㪠MAC アドレス"
+msgstr "無効㪠MACã§ã™"
#: src/err-codes.h:198
msgid "Invalid request"
@@ -801,9 +799,8 @@ msgid "Unknown extension"
msgstr "未知ã®æ‹¡å¼µå­"
#: src/err-codes.h:200
-#, fuzzy
msgid "Unknown critical extension"
-msgstr "拡張ファイルを編集(&E)"
+msgstr "ä¸æ˜Žã®ã‚¯ãƒªãƒã‚«ãƒ«æ‹¡å¼µã§ã™"
#: src/err-codes.h:201
msgid "Locked"
@@ -811,16 +808,15 @@ msgstr "ロックã•ã‚Œã¦ã„ã¾ã™"
#: src/err-codes.h:202
msgid "Unknown option"
-msgstr "未知ã®ã‚ªãƒ—ション"
+msgstr "未知ã®ã‚ªãƒ—ションã§ã™"
#: src/err-codes.h:203
msgid "Unknown command"
-msgstr "未知ã®ã‚³ãƒžãƒ³ãƒ‰"
+msgstr "未知ã®ã‚³ãƒžãƒ³ãƒ‰ã§ã™"
#: src/err-codes.h:204
-#, fuzzy
msgid "Not operational"
-msgstr "オペアンプ"
+msgstr "æ“作ã§ãã¾ã›ã‚“"
#: src/err-codes.h:205
msgid "No passphrase given"
@@ -828,108 +824,87 @@ msgstr "パスフレーズãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:206
msgid "No PIN given"
-msgstr "暗証番å·ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "PINãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:207
-#, fuzzy
msgid "Not enabled"
-msgstr "ロックã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "有効ã¨ãªã£ã¦ã¾ã›ã‚“"
#: src/err-codes.h:208
-#, fuzzy
msgid "No crypto engine"
-msgstr "無効ãªæš—å·ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™"
+msgstr "æš—å·ã‚¨ãƒ³ã‚¸ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:209
-#, fuzzy
msgid "Missing key"
-msgstr "値ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "éµãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:210
-#, fuzzy
msgid "Too many objects"
-msgstr "CMS オブジェクトã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "オブジェクトãŒå¤šã™ãŽã¾ã™"
#: src/err-codes.h:211
msgid "Limit reached"
-msgstr ""
+msgstr "é™ç•Œã«é”ã—ã¾ã—ãŸ"
#: src/err-codes.h:212
-#, fuzzy
msgid "Not initialized"
-msgstr "カードãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgstr "åˆæœŸåŒ–ã•ã‚Œã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:213
-#, fuzzy
msgid "Missing issuer certificate"
-msgstr "証明書ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "発行元証明書ãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:214
msgid "No keyserver available"
-msgstr ""
+msgstr "キーサーãƒãŒåˆ©ç”¨å¯èƒ½ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:215
-#, fuzzy
msgid "Invalid elliptic curve"
-msgstr "無効ãªæ™‚é–“ã§ã™"
+msgstr "無効ãªæ¥•å††é–¢æ•°ã§ã™"
#: src/err-codes.h:216
-#, fuzzy
msgid "Unknown elliptic curve"
-msgstr "ä¸æ˜Žãªã‚½ãƒ¼ã‚¹ã§ã™"
+msgstr "ä¸æ˜Žã®æ¥•å††é–¢æ•°ã§ã™"
#: src/err-codes.h:217
-#, fuzzy
msgid "Duplicated key"
-msgstr "é‡è¤‡ã—ãŸå€¤ã§ã™"
+msgstr "é‡è¤‡ã—ãŸéµã§ã™"
#: src/err-codes.h:218
-#, fuzzy
msgid "Ambiguous result"
-msgstr "曖昧ãªåå‰ã§ã™"
+msgstr "曖昧ãªçµæžœã§ã™"
#: src/err-codes.h:219
-#, fuzzy
msgid "No crypto context"
-msgstr "無効ãªæš—å·ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™"
+msgstr "æš—å·ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:220
-#, fuzzy
msgid "Wrong crypto context"
-msgstr "無効ãªæš—å·ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™"
+msgstr "誤ã£ãŸæš—å·ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§ã™"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "無効ãªæš—å·ã‚¨ãƒ³ã‚¸ãƒ³ã§ã™"
+msgstr "é–“é•ã£ãŸãªæš—å·ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§ã™"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "æš—å·ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆãŒç«¶åˆã—ã¦ã„ã¾ã™"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "公開éµãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "公開éµãŒå£Šã‚Œã¦ã„ã¾ã™"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "秘密éµãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "秘密éµãŒå£Šã‚Œã¦ã„ã¾ã™"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "無効ãªè¦ç´„アルゴリズムã§ã™"
+msgstr "無効ãªMACアルゴリズムã§ã™"
#: src/err-codes.h:226
-#, fuzzy
msgid "Operation fully cancelled"
-msgstr "æ“作ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+msgstr "æ“作ãŒå®Œå…¨ã«ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
#: src/err-codes.h:227
msgid "Operation not yet finished"
@@ -937,7 +912,7 @@ msgstr "æ“作ãŒã¾ã çµ‚了ã—ã¦ã„ã¾ã›ã‚“"
#: src/err-codes.h:228
msgid "Buffer too short"
-msgstr "ãƒãƒƒãƒ•ã‚¡ã«å…¥ã‚Šãã‚Šã¾ã›ã‚“"
+msgstr "ãƒãƒƒãƒ•ã‚¡ãŒçŸ­ã™ãŽã¾ã™"
#: src/err-codes.h:229
msgid "Invalid length specifier in S-expression"
@@ -949,249 +924,839 @@ msgstr "Så¼ã®ä¸­ã®æ–‡å­—列ãŒé•·ã™ãŽã¾ã™"
#: src/err-codes.h:231
msgid "Unmatched parentheses in S-expression"
-msgstr "Så¼ã®ä¸­ã®æ‹¬å¼§ã«ç›¸æ‰‹ãŒãªã„ã‚‚ã®ãŒã‚ã‚Šã¾ã™"
+msgstr "Så¼ã®æ‹¬å¼§ãŒä¸€è‡´ã—ã¾ã›ã‚“"
#: src/err-codes.h:232
-#, fuzzy
msgid "S-expression not canonical"
-msgstr "\"%expression:1\" ã¯æœ‰åŠ¹ãªæ­£è¦è¡¨ç¾ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgstr "カノニカルãªSå¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:233
-#, fuzzy
msgid "Bad character in S-expression"
-msgstr "表ç¾ã«ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼"
+msgstr "Så¼ã«èª¤ã£ãŸã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãŒã‚ã‚Šã¾ã™"
#: src/err-codes.h:234
-#, fuzzy
msgid "Bad quotation in S-expression"
-msgstr "表ç¾ã«ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼"
+msgstr "Så¼ã®èª¤ã£ãŸã‚¯ã‚ªãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã§ã™"
#: src/err-codes.h:235
-#, fuzzy
msgid "Zero prefix in S-expression"
-msgstr "表ç¾ã«ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼"
+msgstr "Så¼ã®ã‚¼ãƒ­ãƒ»ãƒ—レフィックスã§ã™"
#: src/err-codes.h:236
msgid "Nested display hints in S-expression"
-msgstr ""
+msgstr "Så¼ã«è¡¨ç¤ºãƒ’ントãŒå…¥ã‚Œå­ã«ãªã£ã¦ã„ã¾ã™"
#: src/err-codes.h:237
-#, fuzzy
msgid "Unmatched display hints"
-msgstr "ウィンドウマãƒãƒ¼ã‚¸ãƒ£ã®ãƒ’ント"
+msgstr "表示ヒントãŒä¸€è‡´ã—ã¾ã›ã‚“"
#: src/err-codes.h:238
-#, fuzzy
msgid "Unexpected reserved punctuation in S-expression"
-msgstr "æ¡ä»¶å¼ã«æ§‹æ–‡ã‚¨ãƒ©ãƒ¼: 予期ã—ãªã„トークン `%s' ã§ã™"
+msgstr "Så¼ã«äºˆæœŸã—ãªã„予約ã•ã‚ŒãŸå¥èª­ç‚¹ãŒã‚ã‚Šã¾ã™"
#: src/err-codes.h:239
msgid "Bad hexadecimal character in S-expression"
-msgstr ""
+msgstr "Så¼ã«é–“é•ã£ãŸ16進キャラクタãŒã‚ã‚Šã¾ã™"
#: src/err-codes.h:240
msgid "Odd hexadecimal numbers in S-expression"
-msgstr ""
+msgstr "Så¼ã«ãŠã‹ã—ãª16進キャラクタãŒã‚ã‚Šã¾ã™"
#: src/err-codes.h:241
-#, fuzzy
msgid "Bad octal character in S-expression"
-msgstr "表ç¾ã«ã‚·ãƒ³ã‚¿ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼"
+msgstr "Så¼ã«é–“é•ã£ãŸ8進キャラクタãŒã‚ã‚Šã¾ã™"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
-#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "無効ãªã‚ªãƒ–ジェクト"
+msgid "Database is corrupted"
+msgstr "データベースãŒãŠã‹ã—ããªã£ã¦ã¾ã™"
#: src/err-codes.h:244
-msgid "General IPC error"
-msgstr "一般的ãªIPCエラーã§ã™"
+msgid "Server indicated a failure"
+msgstr "サーãƒãŒå¤±æ•—を示ã—ã¦ã„ã¾ã™"
#: src/err-codes.h:245
-#, fuzzy
-msgid "IPC accept call failed"
-msgstr "dia_plugin_init() ã®å‘¼ã³å‡ºã—ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "No name"
+msgstr "åå‰ãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:246
-msgid "IPC connect call failed"
-msgstr "IPCã®æŽ¥ç¶šã‚³ãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "No key"
+msgstr "éµãŒã‚ã‚Šã¾ã›ã‚“"
#: src/err-codes.h:247
-msgid "Invalid IPC response"
-msgstr "無効㪠IPC 応答"
+msgid "Legacy key"
+msgstr "レガシーãªéµ"
#: src/err-codes.h:248
+msgid "Request too short"
+msgstr "リクエストãŒçŸ­ã™ãŽã¾ã™"
+
+#: src/err-codes.h:249
+msgid "Request too long"
+msgstr "リクエストãŒé•·ã™ãŽã¾ã™"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr "オブジェクトã¯çµ‚了状態ã§ã™"
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "証明書連鎖ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "証明書ãŒå¤§ãã™ãŽã§ã™"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "無効ãªãƒ¬ã‚³ãƒ¼ãƒ‰ã§ã™"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "MACãŒæ¤œè¨¼ã§ãã¾ã›ã‚“"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "予期ã—ãªã„メッセージã§ã™"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "圧縮/伸長ãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "カウンタãŒä¸€å›žã‚Šã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "致命的ãªè­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "æš—å·ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "クライアント証明書ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "クローズã®çŸ¥ã‚‰ã›ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "ãƒã‚±ãƒƒãƒˆãŒæœŸé™åˆ‡ã‚Œã§ã™"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "誤ã£ãŸãƒã‚±ãƒƒãƒˆã§ã™"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "ä¸æ˜Žãªã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ãƒ†ã‚£ã§ã™"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸè¨¼æ˜Žæ›¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸè¨¼æ˜Žæ›¸è¦æ±‚メッセージã§ã™"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸè¨¼æ˜Žæ›¸æ¤œè¨¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸæš—å·å¤‰æ›´ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒãƒ­ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸã‚µãƒ¼ãƒãƒãƒ­ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸã‚µãƒ¼ãƒãƒãƒ­ãƒ¼äº†è§£ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸçµ‚了メッセージã§ã™"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸã‚µãƒ¼ãƒéµäº¤æ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã§èª¤ã£ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆéµäº¤æ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "ãŠã‹ã—ãªæ–‡å­—列ã§ã™"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr "ç¦æ­¢"
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "éµãŒåœæ­¢ã•ã‚Œã¦ã„ã¾ã™"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "カードã®éµã§ã¯ä¸å¯èƒ½ã§ã™"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "無効ãªãƒ­ãƒƒã‚¯ãƒ»ã‚ªãƒ–ジェクトã§ã™"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr "真"
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr "å½"
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "一般IPCエラーã§ã™"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "IPC accept呼ã³å‡ºã—ã«å¤±æ•—"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "IPC connect呼ã³å‡ºã—ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "無効ãªIPC応答ã§ã™"
+
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "無効ãªå€¤ãŒIPCã«æ¸¡ã•ã‚Œã¾ã—ãŸ"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "ä¸å®Œå…¨ãªè¡ŒãŒIPCã«æ¸¡ã•ã‚Œã¾ã—ãŸ"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "IPCã«æ¸¡ã•ã‚ŒãŸè¡ŒãŒé•·ã™ãŽã¾ã™"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "IPCコマンドãŒå…¥ã‚Œå­ã«ãªã£ã¦ã„ã¾ã™"
-#: src/err-codes.h:252
-#, fuzzy
+#: src/err-codes.h:290
msgid "No data callback in IPC"
-msgstr "ã“ã®å±žæ€§ã«ã¯ '%s' (%p) ã¨ã„ã†å±žæ€§ã€ã¾ãŸã¯ãƒ‡ãƒ¼ã‚¿ (%p) ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "IPCã§ãƒ‡ãƒ¼ã‚¿ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
-msgstr ""
+msgstr "IPCã§å•ã„åˆã‚ã›ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
-msgstr "IPC サーãƒã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "IPCサーãƒã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
-msgstr "IPC クライアントã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgstr "IPCクライアントã§ã¯ã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
-msgstr "IPCサーãƒã®é–‹å§‹æ™‚ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgstr "IPCサーãƒã®é–‹å§‹ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
-msgstr "IPC 読ã¿å–りエラー"
+msgstr "IPC読ã¿å–りエラー"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
-msgstr "IPC 書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼"
+msgstr "IPC書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
-msgstr "IPC レイヤã«å¯¾ã™ã‚‹å¤šã™ãŽã‚‹ãƒ‡ãƒ¼ã‚¿ã§ã™"
+msgstr "IPCレイヤã«ãƒ‡ãƒ¼ã‚¿ãŒå¤šã™ãŽã§ã™"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
-msgstr "予期ã—ãªã„ IPC コマンドã§ã™"
+msgstr "予期ã—ãªã„IPCコマンドã§ã™"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
-msgstr "ä¸æ˜Žãª IPC コマンドã§ã™"
+msgstr "ä¸æ˜ŽãªIPCコマンドã§ã™"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
-msgstr "IPC 構文エラーã§ã™"
+msgstr "IPC構文エラーã§ã™"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
-msgstr "IPC 呼ã³å‡ºã—ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+msgstr "IPC呼ã³å‡ºã—ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
-msgstr "IPC ã«å¯¾ã™ã‚‹å…¥åŠ›ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "IPCã«å¯¾ã™ã‚‹å…¥åŠ›ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
-msgstr "IPC ã«å¯¾ã™ã‚‹å‡ºåŠ›ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
+msgstr "IPCã«å¯¾ã™ã‚‹å‡ºåŠ›ã‚½ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
-msgstr "IPC パラメータエラーã§ã™"
+msgstr "IPCパラメータエラーã§ã™"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
-msgstr "ä¸æ˜Žãª IPC å•ã„åˆã‚ã›ã§ã™"
+msgstr "ä¸æ˜ŽãªIPCå•ã„åˆã‚ã›ã§ã™"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "æš—å·ã‚¨ãƒ³ã‚¸ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "User ID already exists"
+msgstr "æ—¢ã«å­˜åœ¨ã—ã¾ã™ (LDAP)"
+
+#: src/err-codes.h:311
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "Name already exists"
+msgstr "æ—¢ã«å­˜åœ¨ã—ã¾ã™ (LDAP)"
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "é‡è¤‡ã—ãŸå€¤ã§ã™"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "証明書ãŒè‹¥ã™ãŽã¾ã™"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "与ãˆã‚‰ã‚ŒãŸã‚ªãƒ–ジェクトãŒå°ã•ã™ãŽã¾ã™"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "ä¸æ˜Žãªåå‰ã§ã™"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "無効ãªæ“作コードã§ã™"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "No name"
+msgid "Wrong name"
+msgstr "åå‰ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "無効㪠OID 文字列ã§ã™"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "無効㪠S-å¼ã§ã™"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "発行元証明書ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "復å·ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "タイムアウトã§ã™"
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr "一般LDAPエラーã§ã™"
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr "一般LDAP属性エラーã§ã™"
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr "一般LDAPエラーã§ã™"
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr "一般Assuanエラーã§ã™"
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr "一般LDAPサーãƒã‚¨ãƒ©ãƒ¼ã§ã™"
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr "一般LDAP更新エラーã§ã™"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr "実験的LDAPエラーコード"
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr "プライベートLDAPエラーコード"
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr "ãã®ä»–ã®ä¸€èˆ¬LDAPエラーã§ã™"
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr "LDAP接続ãŒå¤±æ•—ã—ã¾ã—㟠(X)"
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr "LDAPå‚照制é™ã‚’越ãˆã¾ã—ãŸ"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr "LDAPクライアントã®ãƒ«ãƒ¼ãƒ—"
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr "LDAPã®çµæžœãŒè¿”ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr "LDAP制御ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr "LDAPã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr "LDAP connectエラーã§ã™"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr "LDAPã§ãƒ¡ãƒ¢ãƒªãŒãªããªã‚Šã¾ã—ãŸ"
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr "LDAPルーãƒãƒ³ã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒ‘ラメータã§ã™"
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr "ユーザãŒLDAPæ“作をキャンセルã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr "誤ã£ãŸLDAP検索フィルタã§ã™"
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr "ä¸æ˜Žã®LDAPèªè¨¼æ–¹å¼ã§ã™"
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr "LDAPã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã§ã™"
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr "LDAPデコードã®ã‚¨ãƒ©ãƒ¼"
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr "LDAPエンコードã®ã‚¨ãƒ©ãƒ¼"
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr "LDAPローカルエラー"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr "LDAPサーãƒã«é€£çµ¡ã§ãã¾ã›ã‚“"
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr "LDAPæˆåŠŸã§ã™"
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr "LDAPæ“作エラーã§ã™"
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr "LDAPプロトコルé•å"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr "LDAPã§æ™‚間制é™ã‚’越ãˆã¾ã—ãŸ"
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr "LDAPã§ã‚µã‚¤ã‚ºåˆ¶é™ã‚’越ãˆã¾ã—ãŸ"
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr "LDAP比較 å½"
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr "LDAP比較 真"
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr "LDAPèªè¨¼æ–¹å¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr "å¼·ã„LDAPèªè¨¼ãŒå¿…è¦ã§ã™"
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr "部分的LDAPçµæžœ/å‚照をå—ä¿¡ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr "LDAPå‚ç…§"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr "管ç†LDAP制é™ã‚’越ãˆã¾ã—ãŸ"
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr "クリティカルãªLDAPæ‹¡å¼µãŒåˆ©ç”¨å¯èƒ½ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr "LDAPã«ã‚ˆã‚Šç§˜åŒ¿æ€§ãŒå¿…è¦ã§ã™"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr "LDAP SASLãƒã‚¤ãƒ³ãƒ‰ãŒé€²ã‚“ã§ã„ã¾ã™"
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr "ãã®ã‚ˆã†ãªLDAP属性ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr "未定義ã®LDAP属性型ã§ã™"
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr "LDAPã®ä¸é©åˆ‡ãªãƒžãƒƒãƒãƒ³ã‚°ã§ã™"
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr "LDAP制約é•åã§ã™"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr "LDAPåž‹ã‚ã‚‹ã„ã¯å€¤ãŒå­˜åœ¨ã—ã¾ã™"
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr "LDAPã®ç„¡åŠ¹ãªæ§‹æ–‡ã§ã™"
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr "ãã®ã‚ˆã†ãªLDAPオブジェクトã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr "LDAPエイリアスã®å•é¡Œã§ã™"
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr "LDAPã®ç„¡åŠ¹ãªDN構文状態ã§ã™"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr "LDAPエントリãŒãƒªãƒ¼ãƒ•ã§ã™"
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr "LDAPエイリアスã®ãƒ‡ãƒ¬ãƒ•ã‚¡ãƒ¬ãƒ³ã‚¹å•é¡Œã§ã™"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr "LDAPプロキシã®èªè¨¼å¤±æ•—ã§ã™(X)"
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr "ä¸é©åˆ‡ãªLDAPèªè¨¼ã§ã™"
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr "無効ãªLDAPクレデンシャルã§ã™"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr "LDAPã®ä¸å分ãªã‚¢ã‚¯ã‚»ã‚¹ã§ã™"
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr "LDAPサーãƒãŒãƒ“ジーã§ã™"
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr "LDAPサーãƒãŒåˆ©ç”¨å¯èƒ½ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr "LDAPサーãƒãŒå®Ÿè¡Œã‚’進ã‚ãŸãã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr "LDAPã§ãƒ«ãƒ¼ãƒ—ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ"
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr "LDAPåå‰é•åã§ã™"
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr "LDAPオブジェクトクラスé•åã§ã™"
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "LDAPæ“作ã¯éžãƒªãƒ¼ãƒ•ã«ã¯è¨±ã•ã‚Œã¾ã›ã‚“"
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr "LDAPæ“作ã¯RDNã«ã¯è¨±ã•ã‚Œã¾ã›ã‚“"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr "æ—¢ã«å­˜åœ¨ã—ã¾ã™ (LDAP)"
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr "LDAPオブジェクト・クラスを修正ã§ãã¾ã›ã‚“"
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr "LDAPçµæžœãŒå¤§ãã™ãŽã¾ã™"
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr "LDAPæ“作ã¯è¤‡æ•°ã®DSAã«é–¢ä¸Žã—ã¾ã™"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr "ãƒãƒ¼ãƒãƒ£ãƒ«LDAPリストviewエラー"
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr "ãã®ä»–ã®LDAPエラーã§ã™"
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr "LCUPã§è³‡æºã‚’使ã„æžœãŸã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr "LCUPã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£é•å"
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr "LCUPã®ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ã§ã™"
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr "LCUPã®ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„スキームã§ã™"
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr "LCUPã§ãƒªãƒ­ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™"
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr "LDAPãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr "キャンセルã™ã‚‹LDAPæ“作ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr "LDAPをキャンセルã™ã‚‹ã«ã¯é…ã™ãŽã¾ã™"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr "LDAPをキャンセルã§ãã¾ã›ã‚“"
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr "LDAPアサーションã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr "LDAPã§ãƒ—ロキシã®èªè¨¼ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "ユーザ定義エラーコード 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "ユーザ定義エラーコード 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "ユーザ定義エラーコード 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "ユーザ定義エラーコード 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "ユーザ定義エラーコード 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "ユーザ定義エラーコード 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "ユーザ定義エラーコード 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "ユーザ定義エラーコード 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "ユーザ定義エラーコード 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "ユーザ定義エラーコード 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "ユーザ定義エラーコード 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "ユーザ定義エラーコード 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "ユーザ定義エラーコード 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "ユーザ定義エラーコード 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "ユーザ定義エラーコード 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "ユーザ定義エラーコード 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "errno ãŒç„¡ã„システムエラー"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
-msgstr "ファイル終端 (EOF)"
+msgstr "ファイル終端"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "使用法: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: 警告: %s ã‚’èªè­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#~ msgid "Keyring open"
+#~ msgstr "éµãƒªãƒ³ã‚°ã‚ªãƒ¼ãƒ—ン"
diff --git a/po/libgpg-error.pot b/po/libgpg-error.pot
index 4a4992e..f76480e 100644
--- a/po/libgpg-error.pot
+++ b/po/libgpg-error.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error 1.13\n"
+"Project-Id-Version: libgpg-error 1.27\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -82,26 +82,30 @@ msgid "Assuan"
msgstr ""
#: src/err-sources.h:44
-msgid "Any source"
+msgid "TLS"
msgstr ""
#: src/err-sources.h:45
-msgid "User defined source 1"
+msgid "Any source"
msgstr ""
#: src/err-sources.h:46
-msgid "User defined source 2"
+msgid "User defined source 1"
msgstr ""
#: src/err-sources.h:47
-msgid "User defined source 3"
+msgid "User defined source 2"
msgstr ""
#: src/err-sources.h:48
-msgid "User defined source 4"
+msgid "User defined source 3"
msgstr ""
#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr ""
+
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr ""
@@ -158,7 +162,7 @@ msgid "Invalid cipher algorithm"
msgstr ""
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr ""
#: src/err-codes.h:42
@@ -962,195 +966,763 @@ msgid "Bad octal character in S-expression"
msgstr ""
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
-msgid "Invalid lock object"
+msgid "Database is corrupted"
msgstr ""
#: src/err-codes.h:244
-msgid "General IPC error"
+msgid "Server indicated a failure"
msgstr ""
#: src/err-codes.h:245
-msgid "IPC accept call failed"
+msgid "No name"
msgstr ""
#: src/err-codes.h:246
-msgid "IPC connect call failed"
+msgid "No key"
msgstr ""
#: src/err-codes.h:247
-msgid "Invalid IPC response"
+msgid "Legacy key"
msgstr ""
#: src/err-codes.h:248
-msgid "Invalid value passed to IPC"
+msgid "Request too short"
msgstr ""
#: src/err-codes.h:249
-msgid "Incomplete line passed to IPC"
+msgid "Request too long"
msgstr ""
#: src/err-codes.h:250
-msgid "Line passed to IPC too long"
+msgid "Object is in termination state"
msgstr ""
#: src/err-codes.h:251
-msgid "Nested IPC commands"
+msgid "No certificate chain"
msgstr ""
#: src/err-codes.h:252
-msgid "No data callback in IPC"
+msgid "Certificate is too large"
msgstr ""
#: src/err-codes.h:253
-msgid "No inquire callback in IPC"
+msgid "Invalid record"
msgstr ""
#: src/err-codes.h:254
-msgid "Not an IPC server"
+msgid "The MAC does not verify"
msgstr ""
#: src/err-codes.h:255
-msgid "Not an IPC client"
+msgid "Unexpected message"
msgstr ""
#: src/err-codes.h:256
-msgid "Problem starting IPC server"
+msgid "Compression or decompression failed"
msgstr ""
#: src/err-codes.h:257
-msgid "IPC read error"
+msgid "A counter would wrap"
msgstr ""
#: src/err-codes.h:258
-msgid "IPC write error"
+msgid "Fatal alert message received"
msgstr ""
#: src/err-codes.h:259
-msgid "Too much data for IPC layer"
+msgid "No cipher algorithm"
msgstr ""
#: src/err-codes.h:260
-msgid "Unexpected IPC command"
+msgid "Missing client certificate"
msgstr ""
#: src/err-codes.h:261
-msgid "Unknown IPC command"
+msgid "Close notification received"
msgstr ""
#: src/err-codes.h:262
-msgid "IPC syntax error"
+msgid "Ticket expired"
msgstr ""
#: src/err-codes.h:263
-msgid "IPC call has been cancelled"
+msgid "Bad ticket"
msgstr ""
#: src/err-codes.h:264
-msgid "No input source for IPC"
+msgid "Unknown identity"
msgstr ""
#: src/err-codes.h:265
-msgid "No output source for IPC"
+msgid "Bad certificate message in handshake"
msgstr ""
#: src/err-codes.h:266
-msgid "IPC parameter error"
+msgid "Bad certificate request message in handshake"
msgstr ""
#: src/err-codes.h:267
-msgid "Unknown IPC inquire"
+msgid "Bad certificate verify message in handshake"
msgstr ""
#: src/err-codes.h:268
-msgid "User defined error code 1"
+msgid "Bad change cipher message in handshake"
msgstr ""
#: src/err-codes.h:269
-msgid "User defined error code 2"
+msgid "Bad client hello message in handshake"
msgstr ""
#: src/err-codes.h:270
-msgid "User defined error code 3"
+msgid "Bad server hello message in handshake"
msgstr ""
#: src/err-codes.h:271
-msgid "User defined error code 4"
+msgid "Bad server hello done message in handshake"
msgstr ""
#: src/err-codes.h:272
-msgid "User defined error code 5"
+msgid "Bad finished message in handshake"
msgstr ""
#: src/err-codes.h:273
-msgid "User defined error code 6"
+msgid "Bad server key exchange message in handshake"
msgstr ""
#: src/err-codes.h:274
-msgid "User defined error code 7"
+msgid "Bad client key exchange message in handshake"
msgstr ""
#: src/err-codes.h:275
-msgid "User defined error code 8"
+msgid "Bogus string"
msgstr ""
#: src/err-codes.h:276
-msgid "User defined error code 9"
+msgid "Forbidden"
msgstr ""
#: src/err-codes.h:277
-msgid "User defined error code 10"
+msgid "Key disabled"
msgstr ""
#: src/err-codes.h:278
-msgid "User defined error code 11"
+msgid "Not possible with a card based key"
msgstr ""
#: src/err-codes.h:279
-msgid "User defined error code 12"
+msgid "Invalid lock object"
msgstr ""
#: src/err-codes.h:280
-msgid "User defined error code 13"
+msgid "True"
msgstr ""
#: src/err-codes.h:281
-msgid "User defined error code 14"
+msgid "False"
msgstr ""
#: src/err-codes.h:282
-msgid "User defined error code 15"
+msgid "General IPC error"
msgstr ""
#: src/err-codes.h:283
-msgid "User defined error code 16"
+msgid "IPC accept call failed"
msgstr ""
#: src/err-codes.h:284
-msgid "System error w/o errno"
+msgid "IPC connect call failed"
msgstr ""
#: src/err-codes.h:285
-msgid "Unknown system error"
+msgid "Invalid IPC response"
msgstr ""
#: src/err-codes.h:286
-msgid "End of file"
+msgid "Invalid value passed to IPC"
msgstr ""
#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr ""
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr ""
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr ""
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr ""
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr ""
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr ""
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr ""
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr ""
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr ""
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr ""
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr ""
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr ""
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr ""
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr ""
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr ""
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr ""
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr ""
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr ""
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr ""
+
+#: src/err-codes.h:306
+msgid "Crypto engine too old"
+msgstr ""
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+msgid "Duplicated name"
+msgstr ""
+
+#: src/err-codes.h:313
+msgid "Object is too young"
+msgstr ""
+
+#: src/err-codes.h:314
+msgid "Object is too old"
+msgstr ""
+
+#: src/err-codes.h:315
+msgid "Unknown flag"
+msgstr ""
+
+#: src/err-codes.h:316
+msgid "Invalid execution order"
+msgstr ""
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+msgid "Wrong name"
+msgstr ""
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+msgid "Unknown DNS error"
+msgstr ""
+
+#: src/err-codes.h:322
+msgid "Invalid DNS section"
+msgstr ""
+
+#: src/err-codes.h:323
+msgid "Invalid textual address form"
+msgstr ""
+
+#: src/err-codes.h:324
+msgid "Missing DNS query packet"
+msgstr ""
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+msgid "Verification failed in DNS"
+msgstr ""
+
+#: src/err-codes.h:328
+msgid "DNS Timeout"
+msgstr ""
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr ""
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr ""
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr ""
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr ""
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr ""
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr ""
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr ""
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr ""
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr ""
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr ""
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr ""
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr ""
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr ""
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr ""
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr ""
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr ""
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr ""
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr ""
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr ""
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr ""
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr ""
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr ""
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr ""
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr ""
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr ""
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr ""
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr ""
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr ""
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr ""
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr ""
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr ""
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr ""
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr ""
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr ""
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr ""
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr ""
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr ""
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr ""
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr ""
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr ""
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr ""
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr ""
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr ""
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr ""
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr ""
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr ""
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr ""
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr ""
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr ""
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr ""
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr ""
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr ""
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr ""
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr ""
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr ""
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr ""
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr ""
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr ""
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr ""
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr ""
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr ""
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr ""
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr ""
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr ""
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr ""
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr ""
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr ""
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr ""
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr ""
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr ""
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr ""
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr ""
+
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr ""
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr ""
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr ""
diff --git a/po/nl.gmo b/po/nl.gmo
index 60c9788..8a32eb1 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index bdc1344..58e9683 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -2,20 +2,20 @@
# Copyright (C) 2008 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
#
-# Freek de Kruijf <f.de.kruijf@gmail.com>, 2009, 2010, 2012.
+# Freek de Kruijf <f.de.kruijf@gmail.com>, 2009, 2010, 2012, 2014.
msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.10\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:09+0100\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-17 00:16+0100\n"
"Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.4\n"
+"X-Generator: Lokalize 1.5\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: src/err-sources.h:28
@@ -83,26 +83,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Elke bron"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Gebruikergedefinieerde bron 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Gebruikergedefinieerde bron 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Gebruikergedefinieerde bron 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Gebruikergedefinieerde bron 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Onbekende bron"
@@ -159,7 +163,7 @@ msgid "Invalid cipher algorithm"
msgstr "Ongeldig versleutelingsalgoritme"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Sleutelring open"
#: src/err-codes.h:42
@@ -419,10 +423,8 @@ msgid "No agent running"
msgstr "Er draait geen agent"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
-msgstr "fout met agent"
+msgstr "Fout met agent"
#: src/err-codes.h:107
msgid "Invalid data"
@@ -865,56 +867,40 @@ msgid "Unknown elliptic curve"
msgstr "Onbekende elliptische kromme"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Gedupliceerde waarde"
+msgstr "Dubbele sleutel"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "Dubbelzinnige naam"
+msgstr "Dubbelzinnig resultaat"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "No crypto engine"
msgid "No crypto context"
-msgstr "Geen crypto-engine"
+msgstr "Geen crypto-context"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "No crypto engine"
msgid "Wrong crypto context"
-msgstr "Geen crypto-engine"
+msgstr "Verkeerde crypto-context"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Ongeldige crypto-engine"
+msgstr "Slechte crypto-context"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Conflict in de crypto-context"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Geen publieke sleutel"
+msgstr "Gebroken publieke sleutel"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Geen geheime sleutel"
+msgstr "Gebroken geheime sleutel"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Ongeldig digest-algoritme"
+msgstr "Ongeldig MAC-algoritme"
#: src/err-codes.h:226
msgid "Operation fully cancelled"
@@ -981,197 +967,933 @@ msgid "Bad octal character in S-expression"
msgstr "Fout octaal teken in S-expressie"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Ongeldig object"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Gegevens niet versleuteld"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Onbekende naam"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Geen publieke sleutel"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffer is te kort"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Regel te lang"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Geen certificaatketting"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Certificaat te groot"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Ongeldig record"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "De MAC komt niet overeen"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Onverwacht bericht"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Compressie of decompressie is mislukt"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Een teller loopt rond"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Een alarmeringsbericht over iets fataal ontvangen "
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Geen versleutelingsalgoritme"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Ontbrekend certificaat van client"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Melding over sluiten ontvangen"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Ticket is verlopen"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Slecht ticket"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Onbekende identiteit"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Slecht certificaatbericht in uitwisseling"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Slecht verzoek om certificaatbericht in uitwisseling"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Slecht certificaatbericht over verificatie in uitwisseling"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Slecht wijzigingsbericht over vercijfering in uitwisseling"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Slecht hello-bericht van client in uitwisseling"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Slecht hello-bericht van server in uitwisseling"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Slecht hello-gedaan-bericht van server in uitwisseling"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Slecht bericht over beëindiging in uitwisseling"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Slecht sleuteluitwisselingsbericht van server in uitwisseling"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Slecht sleuteluitwisselingsbericht van client in uitwisseling"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Onzintekenreeks"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Sleutel uitgeschakeld"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Niet mogelijk met een sleutel van een kaart"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Ongeldig vergrendelobject"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Algemene IPC-fout"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "IPC acceptatie-aanroep is mislukt"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "IPC verbindingsoproep is mislukt"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Ongeldige IPC-reactie"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Ongeldige waarde naar IPC gestuurd"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Onvolledige regel naar IPC gestuurd"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Naar IPC gestuurde regel is te lang"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Geneste IPC-commando's"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Geen gegevens terugroep in IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Geen afvraagterugroep in IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Geen IPC-server"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Geen IPC-client"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Probleem met opstarten van IPC-server"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "IPC-leesfout"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "IPC-schrijffout"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Te veel gegevens voor IPC=laag"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Onverwacht IPC-commando"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Onbekend IPC-commando"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "IPC-syntaxfout"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "IPC-oproep is geannuleerd"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Geen invoerbron voor IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Geen uitvoerbron voor IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "IPC-parameterfout"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Onbekende IPC-afvraging"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Geen crypto-engine"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Gedupliceerde waarde"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certificaat te jong"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Geleverd object is te kort"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Onbekende naam"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Ongeldige bewerkingscode"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Onbekende naam"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Onbekende systeemfout"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Ongeldige OID-tekenreeks"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Ongeldige S-expressie"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Ontbrekend certificaat van uitgever"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Ontcijfering is mislukt"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tijdslimiet"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Algemene IPC-fout"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Algemene fout"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Algemene fout"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Algemene Assuan-fout"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Algemene fout"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Algemene Assuan-fout"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC-schrijffout"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Algemene IPC-fout"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "IPC verbindingsoproep is mislukt"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Algemene fout"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Reset van kaart vereist"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Element niet gevonden"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Niet ondersteund"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Onverwachte fout"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Niet-ondersteunde operatie"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Fout certificaat"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Onbekende extensie"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tijdslimiet"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "dirmngr-fout"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "dirmngr-fout"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC-leesfout"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Geen IPC-server"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Succes"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Configuratiefout"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "In strijd met protocol"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Onbekende extensie"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Een alarmeringsbericht over iets fataal ontvangen "
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Algemene fout"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Reset van kaart vereist"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Ongeldig attribuut"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Niet ondersteunde bescherming"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "In strijd met protocol"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Ongeldige status"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Geen CMS-object"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Hardwareprobleem"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ongeldige status"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Coderingsprobleem"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Niet ondersteunde bescherming"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Ongeldige kaart"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Geen sleutelserver beschikbaar"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Ontbrekende actie"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "In strijd met protocol"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Bewerking is nog niet beëindigd"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Bewerking geannuleerd"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Regel te lang"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Bewerking geannuleerd"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Algemene IPC-fout"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Hulpbronnen uitgeput"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "In strijd met protocol"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Ongeldige status"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Niet ondersteund certificaat"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Reset van kaart vereist"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Succes"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Niet in werking"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Niet in werking"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Geen IPC-server"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Ontcijfering is mislukt"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Gebruikergedefinieerde foutcode 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Gebruikergedefinieerde foutcode 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Gebruikergedefinieerde foutcode 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Gebruikergedefinieerde foutcode 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Gebruikergedefinieerde foutcode 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Gebruikergedefinieerde foutcode 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Gebruikergedefinieerde foutcode 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Gebruikergedefinieerde foutcode 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Gebruikergedefinieerde foutcode 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Gebruikergedefinieerde foutcode 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Gebruikergedefinieerde foutcode 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Gebruikergedefinieerde foutcode 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Gebruikergedefinieerde foutcode 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Gebruikergedefinieerde foutcode 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Gebruikergedefinieerde foutcode 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Gebruikergedefinieerde foutcode 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Systeemfout zonder foutnr."
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Onbekende systeemfout"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Einde van bestand"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Onbekende foutcode"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Gebruik: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: waarschuwing: kon %s niet herkennen\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Hulpbronnen uitgeput"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Ongeldige gegevens"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Algemene fout"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "dirmngr-fout"
diff --git a/po/pl.gmo b/po/pl.gmo
index ad2fd87..8be78a2 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index d4453c2..25f7b3b 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,14 +1,14 @@
# Polish translation for libgpg-error.
# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
-# Jakub Bogusz <qboosh@pld-linux.org>, 2004-2013.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2004-2016.
#
msgid ""
msgstr ""
-"Project-Id-Version: libgpg-error 1.12\n"
+"Project-Id-Version: libgpg-error 1.22\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-06-25 18:22+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2016-05-11 18:02+0200\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
"Language: pl\n"
@@ -81,26 +81,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Dowolne źródło"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Zdefiniowane przez użytkownika źródło 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Zdefiniowane przez użytkownika źródło 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Zdefiniowane przez użytkownika źródło 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Zdefiniowane przez użytkownika źródło 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Nieznane źródło"
@@ -157,7 +161,7 @@ msgid "Invalid cipher algorithm"
msgstr "Niepoprawny algorytm szyfru"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Zbiór kluczy otwarty"
#: src/err-codes.h:42
@@ -893,10 +897,8 @@ msgid "Broken secret key"
msgstr "Uszkodzony klucz tajny"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Niepoprawny algorytm skrótu"
+msgstr "Niepoprawny algorytm MAC"
#: src/err-codes.h:226
msgid "Operation fully cancelled"
@@ -963,197 +965,793 @@ msgid "Bad octal character in S-expression"
msgstr "Błędny znak ósemkowy w S-wyrażeniu"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
-#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Niepoprawny obiekt"
+msgid "Database is corrupted"
+msgstr "Baza danych jest uszkodzona"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr "Serwer wskazał niepowodzenie"
+
+#: src/err-codes.h:245
+msgid "No name"
+msgstr "Brak nazwy"
+
+#: src/err-codes.h:246
+msgid "No key"
+msgstr "Brak klucza"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr "Stary typ klucza"
+
+#: src/err-codes.h:248
+msgid "Request too short"
+msgstr "Żądanie za krótkie"
+
+#: src/err-codes.h:249
+msgid "Request too long"
+msgstr "Żądanie za długie"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr "Obiekt jest w stanie końcowym"
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Brak łańcucha certyfikatów"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Certyfikat jest zbyt duży"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Niepoprawny rekord"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "Niepomyślna weryfikacja MAC"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Nieoczekiwany komunikat"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Kompresja lub dekompresja nie powiodła się"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Licznik by się przekręcił"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Otrzymano komunikat alarmu krytycznego"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Brak algorytmu szyfru"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Brak certyfikatu klienta"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Otrzymano powiadomienie o zamknięciu"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Bilet wygasł"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Błędny bilet"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Nieznana tożsamość"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Błędny komunikat certyfikatu przy powitaniu"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Błędny komunikat żądania certyfikatu przy powitaniu"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Błędny komunikat weryfikacji certyfikatu przy powitaniu"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Błędny komunikat zmiany szyfru przy powitaniu"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Błędny komunikat przywitania klienta w powitaniu"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Błędny komunikat przywitania serwera w powitaniu"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Błędny komunikat zakończenia przywitania serwera w powitaniu"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Błędny komunikat zakończenia w powitaniu"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Błędny komunikat wymiany klucza serwera w powitaniu"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Błędny komunikat wymiany klucza klienta w powitaniu"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Fałszywy łańcuch"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr "Zabronione"
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Klucz dezaktywowany"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Niemożliwe przy użyciu klucza opartego na karcie"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Niepoprawny obiekt blokady"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr "Prawda"
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr "Fałsz"
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Błąd ogólny IPC"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Wywołanie accept dla IPC nie powiodło się"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Wywołanie connect dla IPC nie powiodło się"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Niepoprawna odpowiedź IPC"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Niepoprawna wartość przekazana do IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Niekompletna linia przekazana do IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Linia przekazana do IPC zbyt długa"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Zagnieżdżone polecenia IPC"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Brak wywołania zwrotnego dla danych w IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Brak wywołania wstecznego dla zapytań w IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "To nie jest serwer IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "To nie jest klient IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problem z uruchomieniem serwera IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "BÅ‚Ä…d odczytu IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "BÅ‚Ä…d zapisu IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Zbyt dużo danych dla warstwy IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Nieoczekiwane polecenie IPC"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Nieznane polecenie IPC"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "Błąd składni IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "Wywołanie IPC zostało anulowane"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Brak źródła wejściowego dla IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Brak źródła wyjściowego dla IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "BÅ‚Ä…d parametru IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Nieznane zapytanie IPC"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Brak silnika kryptograficznego"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "User ID already exists"
+msgstr "Już istnieje (LDAP)"
+
+#: src/err-codes.h:311
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "Name already exists"
+msgstr "Już istnieje (LDAP)"
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Powtórzona wartość"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certyfikat zbyt młody"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Dostarczony obiekt jest zbyt mały"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nieznana nazwa"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Niepoprawny kod operacji"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "No name"
+msgid "Wrong name"
+msgstr "Brak nazwy"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Nieznany błąd systemu"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Niepoprawny łańcuch OID"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Niepoprawne S-wyrażenie"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Brak certyfikatu wystawcy"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Odszyfrowywanie nie powiodło się"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Upłynął limit czasu"
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr "Błąd ogólny LDAP"
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr "Błąd ogólny atrybutu LDAP"
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr "Błąd ogólny nazwy LDAP"
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr "Błąd ogólny bezpieczeństwa LDAP"
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr "Błąd ogólny usługi LDAP"
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr "Błąd ogólny aktualizacji LDAP"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr "Eksperymentalny kod błędu LDAP"
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr "Prywatny kod błędu LDAP"
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr "Inny błąd ogólny LDAP"
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr "Połączenie z LDAP nie powiodło się (X)"
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr "Przekroczony limit odniesień LDAP"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr "Pętla klienta LDAP"
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr "Nie zwrócono wyników LDAP"
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr "Nie znaleziono sterowania LDAP"
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr "Nie obsługiwane przez LDAP"
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr "Błąd połączenia z LDAP"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr "Brak pamięci w LDAP"
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr "Błędny parametr procedury LDAP"
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr "Operacja LDAP anulowana przez użytkownika"
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr "Błędny filtr wyszukiwania LDAP"
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr "Nieznana metoda uwierzytelnienia LDAP"
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr "Limit czasu w LDAP"
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr "BÅ‚Ä…d dekodowania LDAP"
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr "BÅ‚Ä…d kodowania LDAP"
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr "BÅ‚Ä…d lokalny LDAP"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr "Nie można połączyć się z serwerem LDAP"
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr "Sukces LDAP"
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr "BÅ‚Ä…d operacji LDAP"
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr "Błąd protokołu LDAP"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr "Przekroczony limit czasu w LDAP"
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr "Przekroczony limit rozmiaru w LDAP"
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr "Porównanie LDAP fałszywe"
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr "Porównanie LDAP prawdziwe"
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr "Nieobsługiwana metoda uwierzytelnienia LDAP"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr "Wymagana silniejsze uwierzytelnienie LDAP"
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr "Otrzymano częściowe wyniki+odniesienie LDAP"
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr "Odniesienie LDAP"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr "Przekroczony limit administracyjny LDAP"
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr "Krytyczne rozszerzenie LDAP jest niedostępne"
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr "Zaufanie wymagane przez LDAP"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr "WiÄ…zanie LDAP SASL w trakcie"
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr "Nie ma takiego atrybutu LDAP"
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr "Niezdefiniowany typ atrybutu LDAP"
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr "Niewłaściwe dopasowanie w LDAP"
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr "Naruszenie ograniczenia w LDAP"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr "Typ lub wartość LDAP istnieje"
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr "Błędna składnia w LDAP"
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr "Nie ma takiego obiektu LDAP"
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr "Problem z aliasem LDAP"
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr "Błędna składnia DN w LDAP"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr "Wpis LDAP jest liściem"
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr "Problem z rozwinięciem aliasu LDAP"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr "BÅ‚Ä…d autoryzacji do proxy LDAP (X)"
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr "Niewłaściwe uwierzytelnienie LDAP"
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr "Błędne dane uwierzytelniające LDAP"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr "Niewystarczający dostęp dla LDAP"
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr "Serwer LDAP jest zajęty"
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr "Serwer LDAP jest niedostępny"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr "Serwer LDAP nie zamierza wykonać żądania"
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr "Pętla wykryta przez LDAP"
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr "Naruszenie nazw LDAP"
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr "Naruszenie klasy obiektu LDAP"
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Operacja LDAP nie jest dozwolona na nie-liściu"
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operacja LDAP nie jest dozwolona na RDN"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr "Już istnieje (LDAP)"
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr "Nie można zmodyfikować klasy obiektu LDAP"
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr "Wyniki LDAP zbyt duże"
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operacja LDAP obejmuje wiele DSA"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr "BÅ‚Ä…d widoku wirtualnej listy LDAP"
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr "Inny błąd LDAP"
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr "Zasoby wyczerpane w LCUP"
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr "Naruszenie bezpieczeństwa w LCUP"
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr "Błędne dane w LCUP"
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr "Nieobsługiwany schemat w LCUP"
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr "Wymagane przeładowanie w LCUP"
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr "LDAP anulowane"
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr "Brak operacji LDAP do anulowania"
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr "Za późno na anulowanie LDAP"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr "Nie można anulować LDAP"
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr "Zapewnienie LDAP nie powiodło się"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr "Autoryzacja przez proxy odrzucona przez LDAP"
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Zdefiniowany przez użytkownika kod błędu 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Zdefiniowany przez użytkownika kod błędu 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Zdefiniowany przez użytkownika kod błędu 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Zdefiniowany przez użytkownika kod błędu 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Zdefiniowany przez użytkownika kod błędu 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Zdefiniowany przez użytkownika kod błędu 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Zdefiniowany przez użytkownika kod błędu 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Zdefiniowany przez użytkownika kod błędu 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Zdefiniowany przez użytkownika kod błędu 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Zdefiniowany przez użytkownika kod błędu 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Zdefiniowany przez użytkownika kod błędu 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Zdefiniowany przez użytkownika kod błędu 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Zdefiniowany przez użytkownika kod błędu 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Zdefiniowany przez użytkownika kod błędu 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Zdefiniowany przez użytkownika kod błędu 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Zdefiniowany przez użytkownika kod błędu 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "BÅ‚Ä…d systemowy bez errno"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Nieznany błąd systemu"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Koniec pliku"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Nieznany kod błędu"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "SkÅ‚adnia: %s BÅÄ„D-GPG [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: uwaga: nie rozpoznano %s\n"
diff --git a/po/pt.gmo b/po/pt.gmo
new file mode 100644
index 0000000..f14c3cc
--- /dev/null
+++ b/po/pt.gmo
Binary files differ
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..540abb7
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,1899 @@
+# Portuguese translations for libgpg-error package.
+# Copyright (C) 2014 g10 Code GmbH
+# This file is distributed under the same license as the libgpg-error package.
+#
+# paulo <paulo.jorge.tome@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: libgpg-error 1.17\n"
+"Report-Msgid-Bugs-To: translations@gnupg.org\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-24 02:32+0000\n"
+"Last-Translator: Paulo Tomé <paulo.jorge.tome@gmail.com>\n"
+"Language-Team: Portuguese <traduz@debian.pt.org>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.4\n"
+
+#: src/err-sources.h:28
+msgid "Unspecified source"
+msgstr "Fonte não especificada"
+
+#: src/err-sources.h:29
+msgid "gcrypt"
+msgstr "gcrypt"
+
+#: src/err-sources.h:30
+msgid "GnuPG"
+msgstr "GnuPG"
+
+#: src/err-sources.h:31
+msgid "GpgSM"
+msgstr "GpgSM"
+
+#: src/err-sources.h:32
+msgid "GPG Agent"
+msgstr "Agente GPG"
+
+#: src/err-sources.h:33
+msgid "Pinentry"
+msgstr "Pinentry"
+
+#: src/err-sources.h:34
+msgid "SCD"
+msgstr "SCD"
+
+#: src/err-sources.h:35
+msgid "GPGME"
+msgstr "GPGME"
+
+#: src/err-sources.h:36
+msgid "Keybox"
+msgstr "Keybox"
+
+#: src/err-sources.h:37
+msgid "KSBA"
+msgstr "KSBA"
+
+#: src/err-sources.h:38
+msgid "Dirmngr"
+msgstr "Dirmngr"
+
+#: src/err-sources.h:39
+msgid "GSTI"
+msgstr "GSTI"
+
+#: src/err-sources.h:40
+msgid "GPA"
+msgstr "GPA"
+
+#: src/err-sources.h:41
+msgid "Kleopatra"
+msgstr "Kleopatra"
+
+#: src/err-sources.h:42
+msgid "G13"
+msgstr "G13"
+
+#: src/err-sources.h:43
+msgid "Assuan"
+msgstr "Assuan"
+
+#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
+msgid "Any source"
+msgstr "Qualquer fonte"
+
+#: src/err-sources.h:46
+msgid "User defined source 1"
+msgstr "Fonte definida pelo utilizador 1"
+
+#: src/err-sources.h:47
+msgid "User defined source 2"
+msgstr "Fonte definida pelo utilizador 2"
+
+#: src/err-sources.h:48
+msgid "User defined source 3"
+msgstr "Fonte definida pelo utilizador 3"
+
+#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr "Fonte definida pelo utilizador 4"
+
+#: src/err-sources.h:50
+msgid "Unknown source"
+msgstr "Fonte não conhecida"
+
+#: src/err-codes.h:28
+msgid "Success"
+msgstr "Sucesso"
+
+#: src/err-codes.h:29
+msgid "General error"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:30
+msgid "Unknown packet"
+msgstr "Pacote desconhecido"
+
+#: src/err-codes.h:31
+msgid "Unknown version in packet"
+msgstr "Versão desconhecida no pacote"
+
+#: src/err-codes.h:32
+msgid "Invalid public key algorithm"
+msgstr "Algoritmo de chave pública inválido"
+
+#: src/err-codes.h:33
+msgid "Invalid digest algorithm"
+msgstr "Algoritmo de resumo inválido"
+
+#: src/err-codes.h:34
+msgid "Bad public key"
+msgstr "Chave pública errada"
+
+#: src/err-codes.h:35
+msgid "Bad secret key"
+msgstr "Chave secreta errada"
+
+#: src/err-codes.h:36
+msgid "Bad signature"
+msgstr "Assinatura errada"
+
+#: src/err-codes.h:37
+msgid "No public key"
+msgstr "Sem chave pública"
+
+#: src/err-codes.h:38
+msgid "Checksum error"
+msgstr "Soma de verificação errada"
+
+#: src/err-codes.h:39
+msgid "Bad passphrase"
+msgstr "Senha errada"
+
+#: src/err-codes.h:40
+msgid "Invalid cipher algorithm"
+msgstr "Algoritmo de cifra inválido"
+
+#: src/err-codes.h:41
+msgid "Cannot open keyring"
+msgstr "Chaveiro aberto"
+
+#: src/err-codes.h:42
+msgid "Invalid packet"
+msgstr "Pacote inválido"
+
+#: src/err-codes.h:43
+msgid "Invalid armor"
+msgstr "Armadura inválida"
+
+#: src/err-codes.h:44
+msgid "No user ID"
+msgstr "Sem identificador de utilizador"
+
+#: src/err-codes.h:45
+msgid "No secret key"
+msgstr "Sem chave secreta"
+
+#: src/err-codes.h:46
+msgid "Wrong secret key used"
+msgstr "Utilizada chave secreta errada"
+
+#: src/err-codes.h:47
+msgid "Bad session key"
+msgstr "Chave de sessão errada"
+
+#: src/err-codes.h:48
+msgid "Unknown compression algorithm"
+msgstr "Algoritmo de compressão desconhecido"
+
+#: src/err-codes.h:49
+msgid "Number is not prime"
+msgstr "O número não é primo"
+
+#: src/err-codes.h:50
+msgid "Invalid encoding method"
+msgstr "Método de codificação errado"
+
+#: src/err-codes.h:51
+msgid "Invalid encryption scheme"
+msgstr "Esquema de encriptação errado"
+
+#: src/err-codes.h:52
+msgid "Invalid signature scheme"
+msgstr "Esquema de assinatura inválido"
+
+#: src/err-codes.h:53
+msgid "Invalid attribute"
+msgstr "Atributo inválido"
+
+#: src/err-codes.h:54
+msgid "No value"
+msgstr "Sem valor"
+
+#: src/err-codes.h:55
+msgid "Not found"
+msgstr "Não encontrado"
+
+#: src/err-codes.h:56
+msgid "Value not found"
+msgstr "Valor não encontrado"
+
+#: src/err-codes.h:57
+msgid "Syntax error"
+msgstr "Erro de sintaxe"
+
+#: src/err-codes.h:58
+msgid "Bad MPI value"
+msgstr "Valor de MPI errado"
+
+#: src/err-codes.h:59
+msgid "Invalid passphrase"
+msgstr "Senha inválida"
+
+#: src/err-codes.h:60
+msgid "Invalid signature class"
+msgstr "Classe de assinatura inválida"
+
+#: src/err-codes.h:61
+msgid "Resources exhausted"
+msgstr "Recursos esgotados"
+
+#: src/err-codes.h:62
+msgid "Invalid keyring"
+msgstr "Chaveiro inválido"
+
+#: src/err-codes.h:63
+msgid "Trust DB error"
+msgstr "Erro na Base de Dados de confiança"
+
+#: src/err-codes.h:64
+msgid "Bad certificate"
+msgstr "Certificado errado"
+
+#: src/err-codes.h:65
+msgid "Invalid user ID"
+msgstr "Identificador de utilizador errado"
+
+#: src/err-codes.h:66
+msgid "Unexpected error"
+msgstr "Erro inesperado"
+
+#: src/err-codes.h:67
+msgid "Time conflict"
+msgstr "Conflito temporal"
+
+#: src/err-codes.h:68
+msgid "Keyserver error"
+msgstr "Erro no servidor de chaves"
+
+#: src/err-codes.h:69
+msgid "Wrong public key algorithm"
+msgstr "Algoritmo da chave pública errado"
+
+#: src/err-codes.h:70
+msgid "Tribute to D. A."
+msgstr "Tributo a D. A."
+
+#: src/err-codes.h:71
+msgid "Weak encryption key"
+msgstr "Chave de encriptação fraca"
+
+#: src/err-codes.h:72
+msgid "Invalid key length"
+msgstr "Comprimento da chave inválido"
+
+#: src/err-codes.h:73
+msgid "Invalid argument"
+msgstr "Argumento inválido"
+
+#: src/err-codes.h:74
+msgid "Syntax error in URI"
+msgstr "Erro de sintaxe no URI"
+
+#: src/err-codes.h:75
+msgid "Invalid URI"
+msgstr "URI inválido"
+
+#: src/err-codes.h:76
+msgid "Network error"
+msgstr "Erro de rede"
+
+#: src/err-codes.h:77
+msgid "Unknown host"
+msgstr "Anfitrião desconhecido"
+
+#: src/err-codes.h:78
+msgid "Selftest failed"
+msgstr "Auto teste falhou"
+
+#: src/err-codes.h:79
+msgid "Data not encrypted"
+msgstr "Dados não encriptados"
+
+#: src/err-codes.h:80
+msgid "Data not processed"
+msgstr "Dados não processados"
+
+#: src/err-codes.h:81
+msgid "Unusable public key"
+msgstr "Chave pública inutilizável"
+
+#: src/err-codes.h:82
+msgid "Unusable secret key"
+msgstr "Chave secreta inutilizável"
+
+#: src/err-codes.h:83
+msgid "Invalid value"
+msgstr "Valor inválido"
+
+#: src/err-codes.h:84
+msgid "Bad certificate chain"
+msgstr "Cadeia de certificados errada"
+
+#: src/err-codes.h:85
+msgid "Missing certificate"
+msgstr "Certificado em falta"
+
+#: src/err-codes.h:86
+msgid "No data"
+msgstr "Não existem dados"
+
+#: src/err-codes.h:87
+msgid "Bug"
+msgstr "Erro"
+
+#: src/err-codes.h:88
+msgid "Not supported"
+msgstr "Não suportado"
+
+#: src/err-codes.h:89
+msgid "Invalid operation code"
+msgstr "Código de operação inválido"
+
+#: src/err-codes.h:90
+msgid "Timeout"
+msgstr "Tempo limite"
+
+#: src/err-codes.h:91
+msgid "Internal error"
+msgstr "Erro interno"
+
+#: src/err-codes.h:92
+msgid "EOF (gcrypt)"
+msgstr "EOF (gcrypt)"
+
+#: src/err-codes.h:93
+msgid "Invalid object"
+msgstr "Objecto inválido"
+
+#: src/err-codes.h:94
+msgid "Provided object is too short"
+msgstr "O objecto fornecido é demasiado curto"
+
+#: src/err-codes.h:95
+msgid "Provided object is too large"
+msgstr "O objecto fornecido é demasiado grande"
+
+#: src/err-codes.h:96
+msgid "Missing item in object"
+msgstr "Item em falta no objecto"
+
+#: src/err-codes.h:97
+msgid "Not implemented"
+msgstr "Não implementado"
+
+#: src/err-codes.h:98
+msgid "Conflicting use"
+msgstr "Utilização em conflito"
+
+#: src/err-codes.h:99
+msgid "Invalid cipher mode"
+msgstr "Modo de cifra inválido"
+
+#: src/err-codes.h:100
+msgid "Invalid flag"
+msgstr "Flag inválido"
+
+#: src/err-codes.h:101
+msgid "Invalid handle"
+msgstr "Identificador inválido"
+
+#: src/err-codes.h:102
+msgid "Result truncated"
+msgstr "Resultado truncado"
+
+#: src/err-codes.h:103
+msgid "Incomplete line"
+msgstr "Linha incompleta"
+
+#: src/err-codes.h:104
+msgid "Invalid response"
+msgstr "Resposta inválida"
+
+#: src/err-codes.h:105
+msgid "No agent running"
+msgstr "Nenhum agente em execução"
+
+#: src/err-codes.h:106
+msgid "Agent error"
+msgstr "Erro no agente"
+
+#: src/err-codes.h:107
+msgid "Invalid data"
+msgstr "Dados inválidos"
+
+#: src/err-codes.h:108
+msgid "Unspecific Assuan server fault"
+msgstr "Falha não especificada no servidor Assuan"
+
+#: src/err-codes.h:109
+msgid "General Assuan error"
+msgstr "Erro Assuan genérico"
+
+#: src/err-codes.h:110
+msgid "Invalid session key"
+msgstr "Chave de sessão inválida"
+
+#: src/err-codes.h:111
+msgid "Invalid S-expression"
+msgstr "Expressão simbólica inválida"
+
+#: src/err-codes.h:112
+msgid "Unsupported algorithm"
+msgstr "Algoritmo não suportado"
+
+#: src/err-codes.h:113
+msgid "No pinentry"
+msgstr "Sem pinentry"
+
+#: src/err-codes.h:114
+msgid "pinentry error"
+msgstr "Erro no pinentry"
+
+#: src/err-codes.h:115
+msgid "Bad PIN"
+msgstr "PIN errado"
+
+#: src/err-codes.h:116
+msgid "Invalid name"
+msgstr "Nome inválido"
+
+#: src/err-codes.h:117
+msgid "Bad data"
+msgstr "Dados errados"
+
+#: src/err-codes.h:118
+msgid "Invalid parameter"
+msgstr "Parâmetro inválido"
+
+#: src/err-codes.h:119
+msgid "Wrong card"
+msgstr "Cartão errado"
+
+#: src/err-codes.h:120
+msgid "No dirmngr"
+msgstr "Sem dirmngr"
+
+#: src/err-codes.h:121
+msgid "dirmngr error"
+msgstr "Erro no dirmngr"
+
+#: src/err-codes.h:122
+msgid "Certificate revoked"
+msgstr "Certificado revogado"
+
+#: src/err-codes.h:123
+msgid "No CRL known"
+msgstr "Sem CRL conhecido"
+
+#: src/err-codes.h:124
+msgid "CRL too old"
+msgstr "CRL muito velho"
+
+#: src/err-codes.h:125
+msgid "Line too long"
+msgstr "Linha demasiado longa"
+
+#: src/err-codes.h:126
+msgid "Not trusted"
+msgstr "Não é de confiança"
+
+#: src/err-codes.h:127
+msgid "Operation cancelled"
+msgstr "Operação cancelada"
+
+#: src/err-codes.h:128
+msgid "Bad CA certificate"
+msgstr "Certificado BA errado"
+
+#: src/err-codes.h:129
+msgid "Certificate expired"
+msgstr "Certificado expirou"
+
+#: src/err-codes.h:130
+msgid "Certificate too young"
+msgstr "Certificado demasiado novo"
+
+#: src/err-codes.h:131
+msgid "Unsupported certificate"
+msgstr "Certificado não suportado"
+
+#: src/err-codes.h:132
+msgid "Unknown S-expression"
+msgstr "Expressão simbólica desconhecida"
+
+#: src/err-codes.h:133
+msgid "Unsupported protection"
+msgstr "Protecção não suportada"
+
+#: src/err-codes.h:134
+msgid "Corrupted protection"
+msgstr "Protecção corrompida"
+
+#: src/err-codes.h:135
+msgid "Ambiguous name"
+msgstr "Nome ambíguo"
+
+#: src/err-codes.h:136
+msgid "Card error"
+msgstr "Erro de cartão"
+
+#: src/err-codes.h:137
+msgid "Card reset required"
+msgstr "Reinicialização de cartão necessária"
+
+#: src/err-codes.h:138
+msgid "Card removed"
+msgstr "Cartão removido"
+
+#: src/err-codes.h:139
+msgid "Invalid card"
+msgstr "Cartão inválido"
+
+#: src/err-codes.h:140
+msgid "Card not present"
+msgstr "Cartão não presente"
+
+#: src/err-codes.h:141
+msgid "No PKCS15 application"
+msgstr "Sem aplicação PKCS15"
+
+#: src/err-codes.h:142
+msgid "Not confirmed"
+msgstr "Não confirmado"
+
+#: src/err-codes.h:143
+msgid "Configuration error"
+msgstr "Erro de configuração"
+
+#: src/err-codes.h:144
+msgid "No policy match"
+msgstr "Sem correspondência de política"
+
+#: src/err-codes.h:145
+msgid "Invalid index"
+msgstr "Ãndice inválido"
+
+#: src/err-codes.h:146
+msgid "Invalid ID"
+msgstr "Identificador inválido"
+
+#: src/err-codes.h:147
+msgid "No SmartCard daemon"
+msgstr "Sem demónio de SmartCard"
+
+#: src/err-codes.h:148
+msgid "SmartCard daemon error"
+msgstr "Erro no demónio de SmartCard"
+
+#: src/err-codes.h:149
+msgid "Unsupported protocol"
+msgstr "Protocolo não suportado"
+
+#: src/err-codes.h:150
+msgid "Bad PIN method"
+msgstr "Método de PIN errado"
+
+#: src/err-codes.h:151
+msgid "Card not initialized"
+msgstr "Cartão não inicializado"
+
+#: src/err-codes.h:152
+msgid "Unsupported operation"
+msgstr "Operação não suportada"
+
+#: src/err-codes.h:153
+msgid "Wrong key usage"
+msgstr "Utilização de chave errada"
+
+#: src/err-codes.h:154
+msgid "Nothing found"
+msgstr "Nada encontrado"
+
+#: src/err-codes.h:155
+msgid "Wrong blob type"
+msgstr "Tipo de blob errado"
+
+#: src/err-codes.h:156
+msgid "Missing value"
+msgstr "Valor em falta"
+
+#: src/err-codes.h:157
+msgid "Hardware problem"
+msgstr "Problema de hardware"
+
+#: src/err-codes.h:158
+msgid "PIN blocked"
+msgstr "PIN bloqueado"
+
+#: src/err-codes.h:159
+msgid "Conditions of use not satisfied"
+msgstr "Condições de utilização não satisfeitas"
+
+#: src/err-codes.h:160
+msgid "PINs are not synced"
+msgstr "PINs não estão sincronizados"
+
+#: src/err-codes.h:161
+msgid "Invalid CRL"
+msgstr "CRL inválido"
+
+#: src/err-codes.h:162
+msgid "BER error"
+msgstr "Erro de BER"
+
+#: src/err-codes.h:163
+msgid "Invalid BER"
+msgstr "BER inválido"
+
+#: src/err-codes.h:164
+msgid "Element not found"
+msgstr "Elemento não encontrado"
+
+#: src/err-codes.h:165
+msgid "Identifier not found"
+msgstr "Identificador não encontrado"
+
+#: src/err-codes.h:166
+msgid "Invalid tag"
+msgstr "Etiqueta inválida"
+
+#: src/err-codes.h:167
+msgid "Invalid length"
+msgstr "Comprimento inválido"
+
+#: src/err-codes.h:168
+msgid "Invalid key info"
+msgstr "Informação de chave errada"
+
+#: src/err-codes.h:169
+msgid "Unexpected tag"
+msgstr "Etiqueta inesperada"
+
+#: src/err-codes.h:170
+msgid "Not DER encoded"
+msgstr "Não codificado através de DER"
+
+#: src/err-codes.h:171
+msgid "No CMS object"
+msgstr "Sem objecto CMS"
+
+#: src/err-codes.h:172
+msgid "Invalid CMS object"
+msgstr "Objecto CMS inválido"
+
+#: src/err-codes.h:173
+msgid "Unknown CMS object"
+msgstr "Objecto CMS desconhecido"
+
+#: src/err-codes.h:174
+msgid "Unsupported CMS object"
+msgstr "Objecto CMS não suportado"
+
+#: src/err-codes.h:175
+msgid "Unsupported encoding"
+msgstr "Codificação não suportada"
+
+#: src/err-codes.h:176
+msgid "Unsupported CMS version"
+msgstr "Versão de CMS não suportada"
+
+#: src/err-codes.h:177
+msgid "Unknown algorithm"
+msgstr "Algoritmo desconhecido"
+
+#: src/err-codes.h:178
+msgid "Invalid crypto engine"
+msgstr "Motor de encriptação inválido"
+
+#: src/err-codes.h:179
+msgid "Public key not trusted"
+msgstr "Chave pública não é de confiança"
+
+#: src/err-codes.h:180
+msgid "Decryption failed"
+msgstr "Desencriptação falhada"
+
+#: src/err-codes.h:181
+msgid "Key expired"
+msgstr "Chave expirada"
+
+#: src/err-codes.h:182
+msgid "Signature expired"
+msgstr "Assinatura expirada"
+
+#: src/err-codes.h:183
+msgid "Encoding problem"
+msgstr "Problema de codificação"
+
+#: src/err-codes.h:184
+msgid "Invalid state"
+msgstr "Estado inválido"
+
+#: src/err-codes.h:185
+msgid "Duplicated value"
+msgstr "Valor duplicado"
+
+#: src/err-codes.h:186
+msgid "Missing action"
+msgstr "Acção em falta"
+
+#: src/err-codes.h:187
+msgid "ASN.1 module not found"
+msgstr "Módulo ASN.1 não encontrado"
+
+#: src/err-codes.h:188
+msgid "Invalid OID string"
+msgstr "Sequência OID inválida"
+
+#: src/err-codes.h:189
+msgid "Invalid time"
+msgstr "Tempo inválido"
+
+#: src/err-codes.h:190
+msgid "Invalid CRL object"
+msgstr "Objecto CRL inválido"
+
+#: src/err-codes.h:191
+msgid "Unsupported CRL version"
+msgstr "Versão CRL não suportada"
+
+#: src/err-codes.h:192
+msgid "Invalid certificate object"
+msgstr "Objecto de certificado inválido"
+
+#: src/err-codes.h:193
+msgid "Unknown name"
+msgstr "Nome desconhecido"
+
+#: src/err-codes.h:194
+msgid "A locale function failed"
+msgstr "Uma função de localização falhou"
+
+#: src/err-codes.h:195
+msgid "Not locked"
+msgstr "Não trancado"
+
+#: src/err-codes.h:196
+msgid "Protocol violation"
+msgstr "Violação de protocolo"
+
+#: src/err-codes.h:197
+msgid "Invalid MAC"
+msgstr "MAC inválido"
+
+#: src/err-codes.h:198
+msgid "Invalid request"
+msgstr "Pedido inválido"
+
+#: src/err-codes.h:199
+msgid "Unknown extension"
+msgstr "Extensão desconhecida"
+
+#: src/err-codes.h:200
+msgid "Unknown critical extension"
+msgstr "Extensão crítica desconhecida"
+
+#: src/err-codes.h:201
+msgid "Locked"
+msgstr "Trancado"
+
+#: src/err-codes.h:202
+msgid "Unknown option"
+msgstr "Opção desconhecida"
+
+#: src/err-codes.h:203
+msgid "Unknown command"
+msgstr "Comando desconhecido"
+
+#: src/err-codes.h:204
+msgid "Not operational"
+msgstr "Não operacional"
+
+#: src/err-codes.h:205
+msgid "No passphrase given"
+msgstr "Nenhuma senha dada"
+
+#: src/err-codes.h:206
+msgid "No PIN given"
+msgstr "Sem PIN dado"
+
+#: src/err-codes.h:207
+msgid "Not enabled"
+msgstr "Não habilitado"
+
+#: src/err-codes.h:208
+msgid "No crypto engine"
+msgstr "Sem motor de encriptação"
+
+#: src/err-codes.h:209
+msgid "Missing key"
+msgstr "Chave em falta"
+
+#: src/err-codes.h:210
+msgid "Too many objects"
+msgstr "Demasiados objectos"
+
+#: src/err-codes.h:211
+msgid "Limit reached"
+msgstr "Limite atingido"
+
+#: src/err-codes.h:212
+msgid "Not initialized"
+msgstr "Não inicializado"
+
+#: src/err-codes.h:213
+msgid "Missing issuer certificate"
+msgstr "Certificado do emissor em falta"
+
+#: src/err-codes.h:214
+msgid "No keyserver available"
+msgstr "Sem servidor de chaves disponível"
+
+#: src/err-codes.h:215
+msgid "Invalid elliptic curve"
+msgstr "Curva elíptica inválida"
+
+#: src/err-codes.h:216
+msgid "Unknown elliptic curve"
+msgstr "Curva elíptica desconhecida"
+
+#: src/err-codes.h:217
+msgid "Duplicated key"
+msgstr "Chave duplicada"
+
+#: src/err-codes.h:218
+msgid "Ambiguous result"
+msgstr "Resultado ambíguo"
+
+#: src/err-codes.h:219
+msgid "No crypto context"
+msgstr "Sem contexto de encriptação"
+
+#: src/err-codes.h:220
+msgid "Wrong crypto context"
+msgstr "Contexto de encriptação errado"
+
+#: src/err-codes.h:221
+msgid "Bad crypto context"
+msgstr "Contexto de encriptação inválido"
+
+#: src/err-codes.h:222
+msgid "Conflict in the crypto context"
+msgstr "Conflito no contexto de encriptação"
+
+#: src/err-codes.h:223
+msgid "Broken public key"
+msgstr "Chave pública quebrada"
+
+#: src/err-codes.h:224
+msgid "Broken secret key"
+msgstr "Chave secreta quebrada"
+
+#: src/err-codes.h:225
+msgid "Invalid MAC algorithm"
+msgstr "Algoritmo MAC inválido"
+
+#: src/err-codes.h:226
+msgid "Operation fully cancelled"
+msgstr "Operação totalmente cancelada"
+
+#: src/err-codes.h:227
+msgid "Operation not yet finished"
+msgstr "Operação ainda não completada"
+
+#: src/err-codes.h:228
+msgid "Buffer too short"
+msgstr "Buffer demasiado curto"
+
+#: src/err-codes.h:229
+msgid "Invalid length specifier in S-expression"
+msgstr "Especificador de comprimento inválido na expressão simbólica"
+
+#: src/err-codes.h:230
+msgid "String too long in S-expression"
+msgstr "Sequência de caracteres demasiado longa na expressão simbólica"
+
+#: src/err-codes.h:231
+msgid "Unmatched parentheses in S-expression"
+msgstr "Parênteses não correspondidos na expressão simbólica"
+
+#: src/err-codes.h:232
+msgid "S-expression not canonical"
+msgstr "Expressão simbólica não canónica"
+
+#: src/err-codes.h:233
+msgid "Bad character in S-expression"
+msgstr "Carácter errado na expressão simbólica"
+
+#: src/err-codes.h:234
+msgid "Bad quotation in S-expression"
+msgstr "Plicas erradas na expressão simbólica"
+
+#: src/err-codes.h:235
+msgid "Zero prefix in S-expression"
+msgstr "Prefixo zero na expressão simbólica"
+
+#: src/err-codes.h:236
+msgid "Nested display hints in S-expression"
+msgstr "Dicas de exibição aninhadas na expressão simbólica"
+
+#: src/err-codes.h:237
+msgid "Unmatched display hints"
+msgstr "Dicas de exibição não correspondidas"
+
+#: src/err-codes.h:238
+msgid "Unexpected reserved punctuation in S-expression"
+msgstr "Pontuação reservada não esperada na expressão simbólica"
+
+#: src/err-codes.h:239
+msgid "Bad hexadecimal character in S-expression"
+msgstr "Carácter hexadecimal errado na expressão simbólica"
+
+#: src/err-codes.h:240
+msgid "Odd hexadecimal numbers in S-expression"
+msgstr "Números hexadecimais ímpares na expressão simbólica"
+
+#: src/err-codes.h:241
+msgid "Bad octal character in S-expression"
+msgstr "Carácter octal errado na expressão simbólica"
+
+#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr ""
+
+#: src/err-codes.h:243
+#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Dados não encriptados"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Nome desconhecido"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Sem chave pública"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffer demasiado curto"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Linha demasiado longa"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Sem cadeia de certificados"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Certificado é demasiado grande"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Registo inválido"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "O MAC não se verifica"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Mensagem inesperada"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Compressão ou descompressão falhada"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Um contador daria a volta"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Mensagem de alerta fatal recebida"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Algoritmo de criptografia inexistente"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Certificado cliente em falta"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Notificação de encerramento recebida"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Ticket expirou"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Ticket errado"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Identidade desconhecida"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Mensagem de certificado errada no handshake"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Mensagem de pedido de certificado errada no handshake"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Mensagem de verificação de certificado errada no handshake"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Mensagem de alteração de certificado errada no handshake"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Mensagem de hello do cliente errada no handshake"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Mensagem de hello do servidor errada no handshake"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "Mensagem de hello done do servidor errada no handshake"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Mensagem de conclusão errada no handshake"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Mensagem de troca de chaves do servidor errada no handshake"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Mensagem de troca de chaves do cliente errada no handshake"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Sequência de caracteres adulterada"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Chave desabilitada"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Não possível com uma chave baseada num cartão"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Objecto de tranca inválido"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "Erro genérico de IPC"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "Chamada de aceitação de IPC falhada"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "Chamada de conexão de IPC falhada"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "Resposta de IPC inválida"
+
+#: src/err-codes.h:286
+msgid "Invalid value passed to IPC"
+msgstr "Valor inválido passado ao IPC"
+
+#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr "Linha inválida passada ao IPC"
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr "Linha passada ao IPC demasiado longa"
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr "Comandos IPC aninhados"
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr "Sem retorno de chamada de dados no IPC"
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr "Sem retorno de chamada de inquirição no IPC"
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr "Não é um servidor IPC"
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr "Não é um cliente IPC"
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr "Problema na iniciação do servidor IPC"
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr "Erro de leitura de IPC"
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr "Erro de escrita de IPC"
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr "Demasiados dados para a camada IPC"
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr "Comando IPC inesperado"
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr "Comando IPC desconhecido"
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr "Erro de sintaxe IPC"
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr "Chamada de IPC foi cancelada"
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr "Sem fonte de entrada para o IPC"
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr "Nenhuma fonte de saída para IPC"
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr "Erro de parâmetro IPC"
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr "Inquirição IPC desconhecida"
+
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Sem motor de encriptação"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Valor duplicado"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certificado demasiado novo"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "O objecto fornecido é demasiado curto"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nome desconhecido"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Código de operação inválido"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Nome desconhecido"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Erro de sistema desconhecido"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Sequência OID inválida"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Expressão simbólica inválida"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Certificado do emissor em falta"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Desencriptação falhada"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tempo limite"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Erro genérico de IPC"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Erro Assuan genérico"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Erro Assuan genérico"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Erro de escrita de IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Erro genérico de IPC"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Chamada de conexão de IPC falhada"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Reinicialização de cartão necessária"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Elemento não encontrado"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Não suportado"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Erro inesperado"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Operação não suportada"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Certificado errado"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Extensão desconhecida"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tempo limite"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "Erro no dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "Erro no dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Erro de leitura de IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Não é um servidor IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Sucesso"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Erro de configuração"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Violação de protocolo"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Extensão desconhecida"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "Mensagem de alerta fatal recebida"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Erro genérico"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Reinicialização de cartão necessária"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Atributo inválido"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Protecção não suportada"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Violação de protocolo"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Estado inválido"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Sem objecto CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Problema de hardware"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Estado inválido"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Problema de codificação"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Protecção não suportada"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Cartão inválido"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "Sem servidor de chaves disponível"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Acção em falta"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Violação de protocolo"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Operação ainda não completada"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operação cancelada"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Linha demasiado longa"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operação cancelada"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Erro genérico de IPC"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Recursos esgotados"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Violação de protocolo"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Estado inválido"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Certificado não suportado"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Reinicialização de cartão necessária"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Sucesso"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Não operacional"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Não operacional"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Não é um servidor IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Desencriptação falhada"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr "Código de erro definido pelo utilizador 1"
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr "Código de erro definido pelo utilizador 2"
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr "Código de erro definido pelo utilizador 3"
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr "Código de erro definido pelo utilizador 4"
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr "Código de erro definido pelo utilizador 5"
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr "Código de erro definido pelo utilizador 6"
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr "Código de erro definido pelo utilizador 7"
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr "Código de erro definido pelo utilizador 8"
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr "Código de erro definido pelo utilizador 9"
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr "Código de erro definido pelo utilizador 10"
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr "Código de erro definido pelo utilizador 11"
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr "Código de erro definido pelo utilizador 12"
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr "Código de erro definido pelo utilizador 13"
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr "Código de erro definido pelo utilizador 14"
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr "Código de erro definido pelo utilizador 15"
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr "Código de erro definido pelo utilizador 16"
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr "Erro de sistema sem errno"
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr "Erro de sistema desconhecido"
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr "Fim do ficheiro"
+
+#: src/err-codes.h:429
+msgid "Unknown error code"
+msgstr "Código de erro desconhecido"
+
+#: src/gpg-error.c:450
+#, c-format
+msgid "Usage: %s GPG-ERROR [...]\n"
+msgstr "Utilização: %s GPG-ERROR [...]\n"
+
+#: src/gpg-error.c:633
+#, c-format
+msgid "%s: warning: could not recognize %s\n"
+msgstr "%s: aviso: não consegui reconhecer %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Recursos esgotados"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Dados inválidos"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Erro genérico"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "Erro no dirmngr"
diff --git a/po/ro.gmo b/po/ro.gmo
index 95b9634..3ca1ae5 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 8c9d0a5..fcc3459 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -1,6 +1,6 @@
-# Mesajele în limba românã pentru libgpg-error.
+# Mesajele în limba română pentru libgpg-error.
# Copyright (C) 2005 Free Software Foundation, Inc.
-# Acest fiºier este distribuit sub aceeaºi licenþã ca ºi pachetul libgpg-error.
+# Acest fişier este distribuit sub aceeaşi licenţă ca şi pachetul libgpg-error.
# Laurentiu Buzdugan <lbuz@rolix.org>, 2005.
#
#
@@ -9,19 +9,19 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.1\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: 2013-02-23 20:10+0100\n"
"Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/err-sources.h:28
msgid "Unspecified source"
-msgstr "Sursã nespecificatã"
+msgstr "Sursă nespecificată"
#: src/err-sources.h:29
msgid "gcrypt"
@@ -84,29 +84,33 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
#, fuzzy
msgid "Any source"
-msgstr "Sursã necunoscutã"
+msgstr "Sursă necunoscută"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
-msgstr "Sursã definitã de utilizator 1"
+msgstr "Sursă definită de utilizator 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
-msgstr "Sursã definitã de utilizator 2"
+msgstr "Sursă definită de utilizator 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
-msgstr "Sursã definitã de utilizator 3"
+msgstr "Sursă definită de utilizator 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
-msgstr "Sursã definitã de utilizator 4"
+msgstr "Sursă definită de utilizator 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
-msgstr "Sursã necunoscutã"
+msgstr "Sursă necunoscută"
#: src/err-codes.h:28
msgid "Success"
@@ -114,7 +118,7 @@ msgstr "Succes"
#: src/err-codes.h:29
msgid "General error"
-msgstr "Eroare generalã"
+msgstr "Eroare generală"
#: src/err-codes.h:30
msgid "Unknown packet"
@@ -122,11 +126,11 @@ msgstr "Pachet necunoscut"
#: src/err-codes.h:31
msgid "Unknown version in packet"
-msgstr "versiune necunoscutã în pachet"
+msgstr "versiune necunoscută în pachet"
#: src/err-codes.h:32
msgid "Invalid public key algorithm"
-msgstr "Algoritm cu cheie publicã invalid"
+msgstr "Algoritm cu cheie publică invalid"
#: src/err-codes.h:33
msgid "Invalid digest algorithm"
@@ -134,19 +138,19 @@ msgstr "Algoritm rezumat invalid"
#: src/err-codes.h:34
msgid "Bad public key"
-msgstr "Cheie publicã incorectã"
+msgstr "Cheie publică incorectă"
#: src/err-codes.h:35
msgid "Bad secret key"
-msgstr "Cheie secretã incorectã"
+msgstr "Cheie secretă incorectă"
#: src/err-codes.h:36
msgid "Bad signature"
-msgstr "Semnãturã incorectã"
+msgstr "Semnătură incorectă"
#: src/err-codes.h:37
msgid "No public key"
-msgstr "Nici o cheie publicã"
+msgstr "Nici o cheie publică"
#: src/err-codes.h:38
msgid "Checksum error"
@@ -154,14 +158,14 @@ msgstr "Eroare checksum"
#: src/err-codes.h:39
msgid "Bad passphrase"
-msgstr "Frazã-parolã incorectã"
+msgstr "Frază-parolă incorectă"
#: src/err-codes.h:40
msgid "Invalid cipher algorithm"
msgstr "Algoritm cifrare invalid"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Inel de chei deschis"
#: src/err-codes.h:42
@@ -170,7 +174,7 @@ msgstr "Pachet invalid"
#: src/err-codes.h:43
msgid "Invalid armor"
-msgstr "Armurã invalidã"
+msgstr "Armură invalidă"
#: src/err-codes.h:44
msgid "No user ID"
@@ -178,15 +182,15 @@ msgstr "Nici un ID utilizator."
#: src/err-codes.h:45
msgid "No secret key"
-msgstr "Nici o cheie secretã"
+msgstr "Nici o cheie secretă"
#: src/err-codes.h:46
msgid "Wrong secret key used"
-msgstr "A fost folositã o cheie secretã greºitã"
+msgstr "A fost folosită o cheie secretă greşită"
#: src/err-codes.h:47
msgid "Bad session key"
-msgstr "Cheie de sesiune incorectã"
+msgstr "Cheie de sesiune incorectă"
#: src/err-codes.h:48
msgid "Unknown compression algorithm"
@@ -194,19 +198,19 @@ msgstr "Algoritm compresie necunoscut"
#: src/err-codes.h:49
msgid "Number is not prime"
-msgstr "Numãrul nu este prim"
+msgstr "Numărul nu este prim"
#: src/err-codes.h:50
msgid "Invalid encoding method"
-msgstr "Valoare de encodare invalidã"
+msgstr "Valoare de encodare invalidă"
#: src/err-codes.h:51
msgid "Invalid encryption scheme"
-msgstr "Schemã de cifrare invalidã"
+msgstr "Schemă de cifrare invalidă"
#: src/err-codes.h:52
msgid "Invalid signature scheme"
-msgstr "Schemã de semnãturi invalidã"
+msgstr "Schemă de semnături invalidă"
#: src/err-codes.h:53
msgid "Invalid attribute"
@@ -218,27 +222,27 @@ msgstr "Nici o valoare"
#: src/err-codes.h:55
msgid "Not found"
-msgstr "Nu a fost gãsit(ã)"
+msgstr "Nu a fost găsit(ă)"
#: src/err-codes.h:56
msgid "Value not found"
-msgstr "Valoarea nu a fost gãsitã"
+msgstr "Valoarea nu a fost găsită"
#: src/err-codes.h:57
msgid "Syntax error"
-msgstr "Eroare de sintaxã"
+msgstr "Eroare de sintaxă"
#: src/err-codes.h:58
msgid "Bad MPI value"
-msgstr "Valoare MPI incorectã"
+msgstr "Valoare MPI incorectă"
#: src/err-codes.h:59
msgid "Invalid passphrase"
-msgstr "Frazã-parolã invalidã"
+msgstr "Frază-parolă invalidă"
#: src/err-codes.h:60
msgid "Invalid signature class"
-msgstr "Clasã semnãturi invalidã"
+msgstr "Clasă semnături invalidă"
#: src/err-codes.h:61
msgid "Resources exhausted"
@@ -250,7 +254,7 @@ msgstr "Inel de chei invalid"
#: src/err-codes.h:63
msgid "Trust DB error"
-msgstr "Eroare bazã de date încredere"
+msgstr "Eroare bază de date încredere"
#: src/err-codes.h:64
msgid "Bad certificate"
@@ -262,7 +266,7 @@ msgstr "ID utilizator invalid"
#: src/err-codes.h:66
msgid "Unexpected error"
-msgstr "Eroare neaºteptatã"
+msgstr "Eroare neaşteptată"
#: src/err-codes.h:67
msgid "Time conflict"
@@ -274,7 +278,7 @@ msgstr "Eroare server de chei"
#: src/err-codes.h:69
msgid "Wrong public key algorithm"
-msgstr "Algoritm cheie publicã greºit"
+msgstr "Algoritm cheie publică greşit"
#: src/err-codes.h:70
msgid "Tribute to D. A."
@@ -282,11 +286,11 @@ msgstr "Tribut lui D. A."
#: src/err-codes.h:71
msgid "Weak encryption key"
-msgstr "Cheie de cifrare slabã"
+msgstr "Cheie de cifrare slabă"
#: src/err-codes.h:72
msgid "Invalid key length"
-msgstr "Lungime cheie invalidã"
+msgstr "Lungime cheie invalidă"
#: src/err-codes.h:73
msgid "Invalid argument"
@@ -294,7 +298,7 @@ msgstr "Argument invalid"
#: src/err-codes.h:74
msgid "Syntax error in URI"
-msgstr "Eroare de sintaxã în URI"
+msgstr "Eroare de sintaxă în URI"
#: src/err-codes.h:75
msgid "Invalid URI"
@@ -302,15 +306,15 @@ msgstr "URI incorect"
#: src/err-codes.h:76
msgid "Network error"
-msgstr "Eroare reþea"
+msgstr "Eroare reţea"
#: src/err-codes.h:77
msgid "Unknown host"
-msgstr "Gazdã necunoscutã"
+msgstr "Gazdă necunoscută"
#: src/err-codes.h:78
msgid "Selftest failed"
-msgstr "Auto-test eºuat"
+msgstr "Auto-test eÅŸuat"
#: src/err-codes.h:79
msgid "Data not encrypted"
@@ -322,27 +326,27 @@ msgstr "Date neprocesate"
#: src/err-codes.h:81
msgid "Unusable public key"
-msgstr "Cheie publicã de nefolosit"
+msgstr "Cheie publică de nefolosit"
#: src/err-codes.h:82
msgid "Unusable secret key"
-msgstr "cheie secretã de nefolosit"
+msgstr "cheie secretă de nefolosit"
#: src/err-codes.h:83
msgid "Invalid value"
-msgstr "Valoare invalidã"
+msgstr "Valoare invalidă"
#: src/err-codes.h:84
msgid "Bad certificate chain"
-msgstr "Lanþ certificate incorect"
+msgstr "Lanţ certificate incorect"
#: src/err-codes.h:85
msgid "Missing certificate"
-msgstr "Certificat lipsã"
+msgstr "Certificat lipsă"
#: src/err-codes.h:86
msgid "No data"
-msgstr "Nici o datã"
+msgstr "Nici o dată"
#: src/err-codes.h:87
msgid "Bug"
@@ -350,19 +354,19 @@ msgstr "Bug"
#: src/err-codes.h:88
msgid "Not supported"
-msgstr "Nu este suportat(ã)"
+msgstr "Nu este suportat(ă)"
#: src/err-codes.h:89
msgid "Invalid operation code"
-msgstr "Cod operaþie invalid"
+msgstr "Cod operaţie invalid"
#: src/err-codes.h:90
msgid "Timeout"
-msgstr "Pauzã"
+msgstr "Pauză"
#: src/err-codes.h:91
msgid "Internal error"
-msgstr "Eroare internã"
+msgstr "Eroare internă"
#: src/err-codes.h:92
msgid "EOF (gcrypt)"
@@ -382,15 +386,15 @@ msgstr "Obiectul furnizat e prea larg"
#: src/err-codes.h:96
msgid "Missing item in object"
-msgstr "Articol lipsã în obiect"
+msgstr "Articol lipsă în obiect"
#: src/err-codes.h:97
msgid "Not implemented"
-msgstr "Nu a fost implementat(ã)"
+msgstr "Nu a fost implementat(ă)"
#: src/err-codes.h:98
msgid "Conflicting use"
-msgstr "Folosire în conflict"
+msgstr "Folosire în conflict"
#: src/err-codes.h:99
msgid "Invalid cipher mode"
@@ -410,15 +414,15 @@ msgstr "Rezultat invalid"
#: src/err-codes.h:103
msgid "Incomplete line"
-msgstr "Linie incompletã"
+msgstr "Linie incompletă"
#: src/err-codes.h:104
msgid "Invalid response"
-msgstr "Rãspuns invalid"
+msgstr "Răspuns invalid"
#: src/err-codes.h:105
msgid "No agent running"
-msgstr "Nu ruleazã nici un agent"
+msgstr "Nu rulează nici un agent"
#: src/err-codes.h:106
#, fuzzy
@@ -438,15 +442,15 @@ msgstr "Eroare server Assuan"
#: src/err-codes.h:109
#, fuzzy
msgid "General Assuan error"
-msgstr "Eroare generalã"
+msgstr "Eroare generală"
#: src/err-codes.h:110
msgid "Invalid session key"
-msgstr "Cheie de sesiune invalidã"
+msgstr "Cheie de sesiune invalidă"
#: src/err-codes.h:111
msgid "Invalid S-expression"
-msgstr "Expresie-S invalidã"
+msgstr "Expresie-S invalidă"
#: src/err-codes.h:112
msgid "Unsupported algorithm"
@@ -478,7 +482,7 @@ msgstr "Parametru invalid"
#: src/err-codes.h:119
msgid "Wrong card"
-msgstr "Card greºit"
+msgstr "Card greÅŸit"
#: src/err-codes.h:120
msgid "No dirmngr"
@@ -502,15 +506,15 @@ msgstr "CRL prea vechi"
#: src/err-codes.h:125
msgid "Line too long"
-msgstr "Linie prea lungã"
+msgstr "Linie prea lungă"
#: src/err-codes.h:126
msgid "Not trusted"
-msgstr "Nu este de încredere"
+msgstr "Nu este de încredere"
#: src/err-codes.h:127
msgid "Operation cancelled"
-msgstr "Operaþiune anulatã"
+msgstr "Operaţiune anulată"
#: src/err-codes.h:128
msgid "Bad CA certificate"
@@ -530,15 +534,15 @@ msgstr "Certificat nesuportat"
#: src/err-codes.h:132
msgid "Unknown S-expression"
-msgstr "Expresie-S necunoscutã"
+msgstr "Expresie-S necunoscută"
#: src/err-codes.h:133
msgid "Unsupported protection"
-msgstr "Protecþie nesuportatã"
+msgstr "Protecţie nesuportată"
#: src/err-codes.h:134
msgid "Corrupted protection"
-msgstr "Protecþie coruptã"
+msgstr "Protecţie coruptă"
#: src/err-codes.h:135
msgid "Ambiguous name"
@@ -550,7 +554,7 @@ msgstr "Eroare card"
#: src/err-codes.h:137
msgid "Card reset required"
-msgstr "Este necesarã resetarea cardului"
+msgstr "Este necesară resetarea cardului"
#: src/err-codes.h:138
msgid "Card removed"
@@ -566,11 +570,11 @@ msgstr "Cardul nu este prezent"
#: src/err-codes.h:141
msgid "No PKCS15 application"
-msgstr "Nici o aplicaþie PKCS15"
+msgstr "Nici o aplicaţie PKCS15"
#: src/err-codes.h:142
msgid "Not confirmed"
-msgstr "Neconfirmat(ã)"
+msgstr "Neconfirmat(ă)"
#: src/err-codes.h:143
msgid "Configuration error"
@@ -602,23 +606,23 @@ msgstr "Protocol nesuportat"
#: src/err-codes.h:150
msgid "Bad PIN method"
-msgstr "Metodã PIN incorectã"
+msgstr "Metodă PIN incorectă"
#: src/err-codes.h:151
msgid "Card not initialized"
-msgstr "Card neiniþializat"
+msgstr "Card neiniţializat"
#: src/err-codes.h:152
msgid "Unsupported operation"
-msgstr "Operaþie nesuportatã"
+msgstr "Operaţie nesuportată"
#: src/err-codes.h:153
msgid "Wrong key usage"
-msgstr "Folosire cheie greºitã"
+msgstr "Folosire cheie greşită"
#: src/err-codes.h:154
msgid "Nothing found"
-msgstr "Nu a fost gãsit nimic"
+msgstr "Nu a fost găsit nimic"
#: src/err-codes.h:155
msgid "Wrong blob type"
@@ -626,11 +630,11 @@ msgstr "Tip de blob incorect"
#: src/err-codes.h:156
msgid "Missing value"
-msgstr "Valoare lipsã"
+msgstr "Valoare lipsă"
#: src/err-codes.h:157
msgid "Hardware problem"
-msgstr "Problemã hardware"
+msgstr "Problemă hardware"
#: src/err-codes.h:158
msgid "PIN blocked"
@@ -638,7 +642,7 @@ msgstr "PIN blocat"
#: src/err-codes.h:159
msgid "Conditions of use not satisfied"
-msgstr "Condiþii de folosire nesatisfãcute"
+msgstr "Condiţii de folosire nesatisfăcute"
#: src/err-codes.h:160
msgid "PINs are not synced"
@@ -658,27 +662,27 @@ msgstr "BER invalid"
#: src/err-codes.h:164
msgid "Element not found"
-msgstr "Elementul nu a fost gãsit"
+msgstr "Elementul nu a fost găsit"
#: src/err-codes.h:165
msgid "Identifier not found"
-msgstr "Identificator nu a fost gãsit"
+msgstr "Identificator nu a fost găsit"
#: src/err-codes.h:166
msgid "Invalid tag"
-msgstr "Etichetã invalidã"
+msgstr "Etichetă invalidă"
#: src/err-codes.h:167
msgid "Invalid length"
-msgstr "Lungime invalidã"
+msgstr "Lungime invalidă"
#: src/err-codes.h:168
msgid "Invalid key info"
-msgstr "Informaþii cheie invalide"
+msgstr "Informaţii cheie invalide"
#: src/err-codes.h:169
msgid "Unexpected tag"
-msgstr "Etichetã neaºteptatã"
+msgstr "Etichetă neaşteptată"
#: src/err-codes.h:170
msgid "Not DER encoded"
@@ -702,11 +706,11 @@ msgstr "Obiect CMS nesuportat"
#: src/err-codes.h:175
msgid "Unsupported encoding"
-msgstr "Encodare nesuportatã"
+msgstr "Encodare nesuportată"
#: src/err-codes.h:176
msgid "Unsupported CMS version"
-msgstr "Versiune CMS nesuportatã"
+msgstr "Versiune CMS nesuportată"
#: src/err-codes.h:177
msgid "Unknown algorithm"
@@ -718,43 +722,43 @@ msgstr "Motor cifrare invalid"
#: src/err-codes.h:179
msgid "Public key not trusted"
-msgstr "Cheia publicã nu este de încredere"
+msgstr "Cheia publică nu este de încredere"
#: src/err-codes.h:180
msgid "Decryption failed"
-msgstr "Decriptarea a eºuat"
+msgstr "Decriptarea a eÅŸuat"
#: src/err-codes.h:181
msgid "Key expired"
-msgstr "Cheie expiratã"
+msgstr "Cheie expirată"
#: src/err-codes.h:182
msgid "Signature expired"
-msgstr "Semnãturã expiratã"
+msgstr "Semnătură expirată"
#: src/err-codes.h:183
msgid "Encoding problem"
-msgstr "Problemã de encodare"
+msgstr "Problemă de encodare"
#: src/err-codes.h:184
msgid "Invalid state"
-msgstr "Stare invalidã"
+msgstr "Stare invalidă"
#: src/err-codes.h:185
msgid "Duplicated value"
-msgstr "Valoare dublã"
+msgstr "Valoare dublă"
#: src/err-codes.h:186
msgid "Missing action"
-msgstr "Acþiune lipsã"
+msgstr "Acţiune lipsă"
#: src/err-codes.h:187
msgid "ASN.1 module not found"
-msgstr "Modulul ASN.1 nu a fost gãsit"
+msgstr "Modulul ASN.1 nu a fost găsit"
#: src/err-codes.h:188
msgid "Invalid OID string"
-msgstr "ªir OID invalid"
+msgstr "Åžir OID invalid"
#: src/err-codes.h:189
msgid "Invalid time"
@@ -766,7 +770,7 @@ msgstr "Obiect CRL invalid"
#: src/err-codes.h:191
msgid "Unsupported CRL version"
-msgstr "Versiune CRL nesuportatã"
+msgstr "Versiune CRL nesuportată"
#: src/err-codes.h:192
msgid "Invalid certificate object"
@@ -778,11 +782,11 @@ msgstr "Nume necunoscut"
#: src/err-codes.h:194
msgid "A locale function failed"
-msgstr "O funcþie locale a eºuat"
+msgstr "O funcţie locale a eşuat"
#: src/err-codes.h:195
msgid "Not locked"
-msgstr "Neforþat(ã)"
+msgstr "Neforţat(ă)"
#: src/err-codes.h:196
msgid "Protocol violation"
@@ -794,27 +798,27 @@ msgstr "MAC invalid"
#: src/err-codes.h:198
msgid "Invalid request"
-msgstr "Cerere invalidã"
+msgstr "Cerere invalidă"
#: src/err-codes.h:199
#, fuzzy
msgid "Unknown extension"
-msgstr "Expresie-S necunoscutã"
+msgstr "Expresie-S necunoscută"
#: src/err-codes.h:200
#, fuzzy
msgid "Unknown critical extension"
-msgstr "Expresie-S necunoscutã"
+msgstr "Expresie-S necunoscută"
#: src/err-codes.h:201
#, fuzzy
msgid "Locked"
-msgstr "Neforþat(ã)"
+msgstr "Neforţat(ă)"
#: src/err-codes.h:202
#, fuzzy
msgid "Unknown option"
-msgstr "Expresie-S necunoscutã"
+msgstr "Expresie-S necunoscută"
#: src/err-codes.h:203
#, fuzzy
@@ -824,12 +828,12 @@ msgstr "Cod de eroare necunoscut"
#: src/err-codes.h:204
#, fuzzy
msgid "Not operational"
-msgstr "Operaþie nesuportatã"
+msgstr "Operaţie nesuportată"
#: src/err-codes.h:205
#, fuzzy
msgid "No passphrase given"
-msgstr "Frazã-parolã incorectã"
+msgstr "Frază-parolă incorectă"
#: src/err-codes.h:206
msgid "No PIN given"
@@ -838,7 +842,7 @@ msgstr ""
#: src/err-codes.h:207
#, fuzzy
msgid "Not enabled"
-msgstr "Neforþat(ã)"
+msgstr "Neforţat(ă)"
#: src/err-codes.h:208
#, fuzzy
@@ -848,7 +852,7 @@ msgstr "Motor cifrare invalid"
#: src/err-codes.h:209
#, fuzzy
msgid "Missing key"
-msgstr "Valoare lipsã"
+msgstr "Valoare lipsă"
#: src/err-codes.h:210
#, fuzzy
@@ -862,12 +866,12 @@ msgstr ""
#: src/err-codes.h:212
#, fuzzy
msgid "Not initialized"
-msgstr "Card neiniþializat"
+msgstr "Card neiniţializat"
#: src/err-codes.h:213
#, fuzzy
msgid "Missing issuer certificate"
-msgstr "Certificat lipsã"
+msgstr "Certificat lipsă"
#: src/err-codes.h:214
msgid "No keyserver available"
@@ -881,13 +885,13 @@ msgstr "Timp invalid"
#: src/err-codes.h:216
#, fuzzy
msgid "Unknown elliptic curve"
-msgstr "Sursã necunoscutã"
+msgstr "Sursă necunoscută"
#: src/err-codes.h:217
#, fuzzy
#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Valoare dublã"
+msgstr "Valoare dublă"
#: src/err-codes.h:218
#, fuzzy
@@ -919,13 +923,13 @@ msgstr ""
#, fuzzy
#| msgid "No public key"
msgid "Broken public key"
-msgstr "Nici o cheie publicã"
+msgstr "Nici o cheie publică"
#: src/err-codes.h:224
#, fuzzy
#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Nici o cheie secretã"
+msgstr "Nici o cheie secretă"
#: src/err-codes.h:225
#, fuzzy
@@ -936,12 +940,12 @@ msgstr "Algoritm rezumat invalid"
#: src/err-codes.h:226
#, fuzzy
msgid "Operation fully cancelled"
-msgstr "Operaþiune anulatã"
+msgstr "Operaţiune anulată"
#: src/err-codes.h:227
#, fuzzy
msgid "Operation not yet finished"
-msgstr "Operaþiune anulatã"
+msgstr "Operaţiune anulată"
#: src/err-codes.h:228
msgid "Buffer too short"
@@ -949,260 +953,999 @@ msgstr "Buffer prea scurt"
#: src/err-codes.h:229
msgid "Invalid length specifier in S-expression"
-msgstr "Specificarea lungimii invalidã în expresia-S"
+msgstr "Specificarea lungimii invalidă în expresia-S"
#: src/err-codes.h:230
msgid "String too long in S-expression"
-msgstr "ªir prea lung în expresia-S"
+msgstr "Şir prea lung în expresia-S"
#: src/err-codes.h:231
msgid "Unmatched parentheses in S-expression"
-msgstr "Parantezã fãrã pereche în expresia-S"
+msgstr "Paranteză fără pereche în expresia-S"
#: src/err-codes.h:232
msgid "S-expression not canonical"
-msgstr "Expresia-S nu este canonicã"
+msgstr "Expresia-S nu este canonică"
#: src/err-codes.h:233
msgid "Bad character in S-expression"
-msgstr "Caracter invalid în expresia-S"
+msgstr "Caracter invalid în expresia-S"
#: src/err-codes.h:234
msgid "Bad quotation in S-expression"
-msgstr "Ghilimele incorecte în expresia-S"
+msgstr "Ghilimele incorecte în expresia-S"
#: src/err-codes.h:235
msgid "Zero prefix in S-expression"
-msgstr "Prefix zero în expresia-S"
+msgstr "Prefix zero în expresia-S"
#: src/err-codes.h:236
msgid "Nested display hints in S-expression"
-msgstr "Indicaþii de afiºare încuibãrite în expresia-S"
+msgstr "Indicaţii de afişare încuibărite în expresia-S"
#: src/err-codes.h:237
msgid "Unmatched display hints"
-msgstr "Indicaþii de afiºare fãrã pereche"
+msgstr "Indicaţii de afişare fără pereche"
#: src/err-codes.h:238
msgid "Unexpected reserved punctuation in S-expression"
-msgstr "Punctuaþie rezervatã neaºteptatã în expresia-S"
+msgstr "Punctuaţie rezervată neaşteptată în expresia-S"
#: src/err-codes.h:239
msgid "Bad hexadecimal character in S-expression"
-msgstr "Caracter hexazecimal incorect în expresia-S"
+msgstr "Caracter hexazecimal incorect în expresia-S"
#: src/err-codes.h:240
msgid "Odd hexadecimal numbers in S-expression"
-msgstr "Numere hexazecimale ciudate în expresia-S"
+msgstr "Numere hexazecimale ciudate în expresia-S"
#: src/err-codes.h:241
msgid "Bad octal character in S-expression"
-msgstr "Caracter octal incorect în expresia-S"
+msgstr "Caracter octal incorect în expresia-S"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Date necifrate"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Nume necunoscut"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Nici o cheie publică"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffer prea scurt"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Linie prea lungă"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "Lanţ certificate incorect"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Certificat prea recent"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "Card invalid"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Etichetă neaşteptată"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "Algoritm cifrare invalid"
+
+#: src/err-codes.h:260
+#, fuzzy
+msgid "Missing client certificate"
+msgstr "Certificat lipsă"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Certificat revocat"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "Cheie expirată"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "Cheie publică incorectă"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Pachet necunoscut"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "Lanţ certificate incorect"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "Cheie expirată"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
#| msgid "Invalid object"
msgid "Invalid lock object"
msgstr "Obiect invalid"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
#, fuzzy
msgid "General IPC error"
-msgstr "Eroare generalã"
+msgstr "Eroare generală"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr ""
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr ""
-#: src/err-codes.h:247
+#: src/err-codes.h:285
#, fuzzy
msgid "Invalid IPC response"
-msgstr "Rãspuns invalid"
+msgstr "Răspuns invalid"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
#, fuzzy
msgid "Invalid value passed to IPC"
-msgstr "Valoare invalidã"
+msgstr "Valoare invalidă"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
#, fuzzy
msgid "Incomplete line passed to IPC"
-msgstr "Linie incompletã"
+msgstr "Linie incompletă"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
#, fuzzy
msgid "Line passed to IPC too long"
-msgstr "Linie prea lungã"
+msgstr "Linie prea lungă"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr ""
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr ""
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr ""
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr ""
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr ""
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr ""
-#: src/err-codes.h:257
+#: src/err-codes.h:295
#, fuzzy
msgid "IPC read error"
msgstr "Eroare card"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
#, fuzzy
msgid "IPC write error"
msgstr "Eroare card"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr ""
-#: src/err-codes.h:260
+#: src/err-codes.h:298
#, fuzzy
msgid "Unexpected IPC command"
-msgstr "Etichetã neaºteptatã"
+msgstr "Etichetă neaşteptată"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
#, fuzzy
msgid "Unknown IPC command"
msgstr "Cod de eroare necunoscut"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
#, fuzzy
msgid "IPC syntax error"
-msgstr "Eroare de sintaxã"
+msgstr "Eroare de sintaxă"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr ""
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr ""
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr ""
-#: src/err-codes.h:266
+#: src/err-codes.h:304
#, fuzzy
msgid "IPC parameter error"
msgstr "Eroare card"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
#, fuzzy
msgid "Unknown IPC inquire"
-msgstr "Sursã necunoscutã"
+msgstr "Sursă necunoscută"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+msgid "Crypto engine too old"
+msgstr "Motor cifrare invalid"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Valoare dublă"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certificat prea recent"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Obiectul furnizat e prea scurt"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Nume necunoscut"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Cod operaţie invalid"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Nume necunoscut"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Eroare de sistem necunoscută"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Åžir OID invalid"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Expresie-S invalidă"
+
+#: src/err-codes.h:324
+#, fuzzy
+msgid "Missing DNS query packet"
+msgstr "Certificat lipsă"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Decriptarea a eÅŸuat"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Pauză"
+
+#: src/err-codes.h:329
+#, fuzzy
+msgid "General LDAP error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:332
+#, fuzzy
+msgid "General LDAP security error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:334
+#, fuzzy
+msgid "General LDAP update error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+msgid "Private LDAP error code"
+msgstr "Eroare card"
+
+#: src/err-codes.h:337
+#, fuzzy
+msgid "Other general LDAP error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Decriptarea a eÅŸuat"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Este necesară resetarea cardului"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Elementul nu a fost găsit"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Nu este suportat(ă)"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Eroare neaşteptată"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Operaţie nesuportată"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Certificat incorect"
+
+#: src/err-codes.h:349
+#, fuzzy
+msgid "Unknown LDAP authentication method"
+msgstr "Expresie-S necunoscută"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Pauză"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "eroare dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "eroare dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+msgid "LDAP local error"
+msgstr "Eroare card"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr ""
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Succes"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Eroare de configurare"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Violare de protocol"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+msgid "LDAP authentication method not supported"
+msgstr "Expresie-S necunoscută"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Este necesară resetarea cardului"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Argument invalid"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Protecţie nesuportată"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Violare de protocol"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Stare invalidă"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Nici un obiect CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Problemă hardware"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Stare invalidă"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Problemă de encodare"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Protecţie nesuportată"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Card invalid"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Acţiune lipsă"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Violare de protocol"
+
+#: src/err-codes.h:391
+#, fuzzy
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Operaţiune anulată"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Operaţiune anulată"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Linie prea lungă"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Operaţiune anulată"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+msgid "Other LDAP error"
+msgstr "Eroare generală"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Resurse epuizate"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Violare de protocol"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Stare invalidă"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Certificat nesuportat"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Este necesară resetarea cardului"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Succes"
+
+#: src/err-codes.h:405
+#, fuzzy
+msgid "No LDAP operation to cancel"
+msgstr "Operaţie nesuportată"
+
+#: src/err-codes.h:406
+#, fuzzy
+msgid "Too late to cancel LDAP"
+msgstr "Operaţie nesuportată"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr ""
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Decriptarea a eÅŸuat"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Cod de eroare definit de utilizator 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Cod de eroare definit de utilizator 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Cod de eroare definit de utilizator 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Cod de eroare definit de utilizator 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Cod de eroare definit de utilizator 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Cod de eroare definit de utilizator 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Cod de eroare definit de utilizator 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Cod de eroare definit de utilizator 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Cod de eroare definit de utilizator 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Cod de eroare definit de utilizator 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Cod de eroare definit de utilizator 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Cod de eroare definit de utilizator 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Cod de eroare definit de utilizator 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Cod de eroare definit de utilizator 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Cod de eroare definit de utilizator 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Cod de eroare definit de utilizator 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr ""
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
-msgstr "Eroare de sistem necunoscutã"
+msgstr "Eroare de sistem necunoscută"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
-msgstr "Sfârºit de fiºier"
+msgstr "Sfârşit de fişier"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Cod de eroare necunoscut"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Folosire: %s EROARE-GPG [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
-msgstr "%s: avertisment: nu am putut recunoaºte %s\n"
+msgstr "%s: avertisment: nu am putut recunoaÅŸte %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Resurse epuizate"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Date invalide"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Eroare generală"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "eroare dirmngr"
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644
index 0000000..0fd2d56
--- /dev/null
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..a9e3753
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,1763 @@
+# Russian translation for libgpg-error.
+# Copyright (C) 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the original package.
+# Ineiev <ineiev@gnu.org>, 2014, 2015
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgpg-error\n"
+"Report-Msgid-Bugs-To: translations@gnupg.org\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2015-09-27 12:04+0000\n"
+"Last-Translator: Ineiev <ineiev@gnu.org>\n"
+"Language-Team: Russian <gnupg-ru@gnupg.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/err-sources.h:28
+msgid "Unspecified source"
+msgstr "Ðеуказанный иÑточник"
+
+#: src/err-sources.h:29
+msgid "gcrypt"
+msgstr "gcrypt"
+
+#: src/err-sources.h:30
+msgid "GnuPG"
+msgstr "GnuPG"
+
+#: src/err-sources.h:31
+msgid "GpgSM"
+msgstr "GpgSM"
+
+#: src/err-sources.h:32
+msgid "GPG Agent"
+msgstr "Ðгент GPG"
+
+#: src/err-sources.h:33
+msgid "Pinentry"
+msgstr "Ввод PIN"
+
+#: src/err-sources.h:34
+msgid "SCD"
+msgstr "SCD"
+
+#: src/err-sources.h:35
+msgid "GPGME"
+msgstr "GPGME"
+
+#: src/err-sources.h:36
+msgid "Keybox"
+msgstr "Щит Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹"
+
+#: src/err-sources.h:37
+msgid "KSBA"
+msgstr "KSBA"
+
+#: src/err-sources.h:38
+msgid "Dirmngr"
+msgstr "Dirmngr"
+
+#: src/err-sources.h:39
+msgid "GSTI"
+msgstr "GSTI"
+
+#: src/err-sources.h:40
+msgid "GPA"
+msgstr "GPA"
+
+#: src/err-sources.h:41
+msgid "Kleopatra"
+msgstr "Kleopatra"
+
+#: src/err-sources.h:42
+msgid "G13"
+msgstr "G13"
+
+#: src/err-sources.h:43
+msgid "Assuan"
+msgstr "Assuan"
+
+#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
+msgid "Any source"
+msgstr "Любой иÑточник"
+
+#: src/err-sources.h:46
+msgid "User defined source 1"
+msgstr "ПользовательÑкий иÑточник 1"
+
+#: src/err-sources.h:47
+msgid "User defined source 2"
+msgstr "ПользовательÑкий иÑточник 2"
+
+#: src/err-sources.h:48
+msgid "User defined source 3"
+msgstr "ПользовательÑкий иÑточник 3"
+
+#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr "ПользовательÑкий иÑточник 4"
+
+#: src/err-sources.h:50
+msgid "Unknown source"
+msgstr "ÐеизвеÑтный иÑточник"
+
+#: src/err-codes.h:28
+msgid "Success"
+msgstr "УÑпешное завершение"
+
+#: src/err-codes.h:29
+msgid "General error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:30
+msgid "Unknown packet"
+msgstr "ÐеизвеÑтный пакет"
+
+#: src/err-codes.h:31
+msgid "Unknown version in packet"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð² пакете"
+
+#: src/err-codes.h:32
+msgid "Invalid public key algorithm"
+msgstr "ÐедопуÑтимый алгоритм ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ ключом"
+
+#: src/err-codes.h:33
+msgid "Invalid digest algorithm"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñ…Ñш-функциÑ"
+
+#: src/err-codes.h:34
+msgid "Bad public key"
+msgstr "Плохой открытый ключ"
+
+#: src/err-codes.h:35
+msgid "Bad secret key"
+msgstr "Плохой закрытый ключ"
+
+#: src/err-codes.h:36
+msgid "Bad signature"
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ"
+
+#: src/err-codes.h:37
+msgid "No public key"
+msgstr "Ðет открытого ключа"
+
+#: src/err-codes.h:38
+msgid "Checksum error"
+msgstr "Ошибка контрольной Ñуммы"
+
+#: src/err-codes.h:39
+msgid "Bad passphrase"
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°-пароль"
+
+#: src/err-codes.h:40
+msgid "Invalid cipher algorithm"
+msgstr "ÐедопуÑтимый алгоритм Ñимметричного шифрованиÑ"
+
+#: src/err-codes.h:41
+msgid "Cannot open keyring"
+msgstr "Таблица ключей открыта"
+
+#: src/err-codes.h:42
+msgid "Invalid packet"
+msgstr "ÐедопуÑтимый пакет"
+
+#: src/err-codes.h:43
+msgid "Invalid armor"
+msgstr "ÐедопуÑтимый текÑтовый формат"
+
+#: src/err-codes.h:44
+msgid "No user ID"
+msgstr "Ðет ID пользователÑ"
+
+#: src/err-codes.h:45
+msgid "No secret key"
+msgstr "Ðет закрытого ключа"
+
+#: src/err-codes.h:46
+msgid "Wrong secret key used"
+msgstr "ИÑпользован неверный закрытый ключ"
+
+#: src/err-codes.h:47
+msgid "Bad session key"
+msgstr "Плохой ÑеанÑовый ключ"
+
+#: src/err-codes.h:48
+msgid "Unknown compression algorithm"
+msgstr "ÐеизвеÑтный алгоритм ÑжатиÑ"
+
+#: src/err-codes.h:49
+msgid "Number is not prime"
+msgstr "ЧиÑло не проÑтое"
+
+#: src/err-codes.h:50
+msgid "Invalid encoding method"
+msgstr "ÐедопуÑтимый метод кодированиÑ"
+
+#: src/err-codes.h:51
+msgid "Invalid encryption scheme"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñхема шифрованиÑ"
+
+#: src/err-codes.h:52
+msgid "Invalid signature scheme"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñхема подпиÑи"
+
+#: src/err-codes.h:53
+msgid "Invalid attribute"
+msgstr "ÐедопуÑтимый атрибут"
+
+#: src/err-codes.h:54
+msgid "No value"
+msgstr "Ðет значениÑ"
+
+#: src/err-codes.h:55
+msgid "Not found"
+msgstr "Ðе найдено"
+
+#: src/err-codes.h:56
+msgid "Value not found"
+msgstr "Значение не найдено"
+
+#: src/err-codes.h:57
+msgid "Syntax error"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:58
+msgid "Bad MPI value"
+msgstr "Плохое значение MPI"
+
+#: src/err-codes.h:59
+msgid "Invalid passphrase"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°-пароль"
+
+#: src/err-codes.h:60
+msgid "Invalid signature class"
+msgstr "ÐедопуÑтимый клаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñи"
+
+#: src/err-codes.h:61
+msgid "Resources exhausted"
+msgstr "Ðехватка реÑурÑов"
+
+#: src/err-codes.h:62
+msgid "Invalid keyring"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° ключей"
+
+#: src/err-codes.h:63
+msgid "Trust DB error"
+msgstr "Ошибка таблицы довериÑ"
+
+#: src/err-codes.h:64
+msgid "Bad certificate"
+msgstr "Плохой Ñертификат"
+
+#: src/err-codes.h:65
+msgid "Invalid user ID"
+msgstr "ÐедопуÑтимый ID пользователÑ"
+
+#: src/err-codes.h:66
+msgid "Unexpected error"
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:67
+msgid "Time conflict"
+msgstr "Противоречие времен"
+
+#: src/err-codes.h:68
+msgid "Keyserver error"
+msgstr "Ошибка Ñервера ключей"
+
+#: src/err-codes.h:69
+msgid "Wrong public key algorithm"
+msgstr "Ðеверный алгоритм ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ ключом"
+
+#: src/err-codes.h:70
+msgid "Tribute to D. A."
+msgstr "Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ D. A."
+
+#: src/err-codes.h:71
+msgid "Weak encryption key"
+msgstr "Слабый ключ шифрованиÑ"
+
+#: src/err-codes.h:72
+msgid "Invalid key length"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ключа"
+
+#: src/err-codes.h:73
+msgid "Invalid argument"
+msgstr "ÐедопуÑтимый аргумент"
+
+#: src/err-codes.h:74
+msgid "Syntax error in URI"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в URI"
+
+#: src/err-codes.h:75
+msgid "Invalid URI"
+msgstr "ÐедопуÑтимый URI"
+
+#: src/err-codes.h:76
+msgid "Network error"
+msgstr "Ошибка Ñети"
+
+#: src/err-codes.h:77
+msgid "Unknown host"
+msgstr "ÐеизвеÑтный хоÑÑ‚"
+
+#: src/err-codes.h:78
+msgid "Selftest failed"
+msgstr "Сбой при Ñамопроверке"
+
+#: src/err-codes.h:79
+msgid "Data not encrypted"
+msgstr "Данные не зашифрованы"
+
+#: src/err-codes.h:80
+msgid "Data not processed"
+msgstr "Данные не обработаны"
+
+#: src/err-codes.h:81
+msgid "Unusable public key"
+msgstr "Ðепригодный открытый ключ"
+
+#: src/err-codes.h:82
+msgid "Unusable secret key"
+msgstr "Ðепригодный закрытый ключ"
+
+#: src/err-codes.h:83
+msgid "Invalid value"
+msgstr "ÐедопуÑтимое значение"
+
+#: src/err-codes.h:84
+msgid "Bad certificate chain"
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ ÑÐµÑ€Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð½Ð°Ñ Ñ†ÐµÐ¿ÑŒ"
+
+#: src/err-codes.h:85
+msgid "Missing certificate"
+msgstr "Ðе хватает Ñертификата"
+
+#: src/err-codes.h:86
+msgid "No data"
+msgstr "Ðет данных"
+
+#: src/err-codes.h:87
+msgid "Bug"
+msgstr "Ошибка в программе"
+
+#: src/err-codes.h:88
+msgid "Not supported"
+msgstr "Ðе поддерживаетÑÑ"
+
+#: src/err-codes.h:89
+msgid "Invalid operation code"
+msgstr "ÐедопуÑтимый код операции"
+
+#: src/err-codes.h:90
+msgid "Timeout"
+msgstr "Лимит времени"
+
+#: src/err-codes.h:91
+msgid "Internal error"
+msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:92
+msgid "EOF (gcrypt)"
+msgstr "Конец файла (gcrypt)"
+
+#: src/err-codes.h:93
+msgid "Invalid object"
+msgstr "ÐедопуÑтимый объект"
+
+#: src/err-codes.h:94
+msgid "Provided object is too short"
+msgstr "Введенный объект Ñлишком мал"
+
+#: src/err-codes.h:95
+msgid "Provided object is too large"
+msgstr "Введенный объект Ñлишком велик"
+
+#: src/err-codes.h:96
+msgid "Missing item in object"
+msgstr "Ð’ объекте недоÑтает Ñлемента"
+
+#: src/err-codes.h:97
+msgid "Not implemented"
+msgstr "Ðе реализовано"
+
+#: src/err-codes.h:98
+msgid "Conflicting use"
+msgstr "Противоречивое иÑпользование"
+
+#: src/err-codes.h:99
+msgid "Invalid cipher mode"
+msgstr "ÐедопуÑтимый решим шифрованиÑ"
+
+#: src/err-codes.h:100
+msgid "Invalid flag"
+msgstr "ÐедопуÑтимый признак"
+
+#: src/err-codes.h:101
+msgid "Invalid handle"
+msgstr "ÐедопуÑтимый указатель"
+
+#: src/err-codes.h:102
+msgid "Result truncated"
+msgstr "Результат уÑечен"
+
+#: src/err-codes.h:103
+msgid "Incomplete line"
+msgstr "ÐÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтрока"
+
+#: src/err-codes.h:104
+msgid "Invalid response"
+msgstr "ÐедопуÑтимый ответ"
+
+#: src/err-codes.h:105
+msgid "No agent running"
+msgstr "Ðгент не работает"
+
+#: src/err-codes.h:106
+msgid "Agent error"
+msgstr "Ошибка агента"
+
+#: src/err-codes.h:107
+msgid "Invalid data"
+msgstr "ÐедопуÑтимые данные"
+
+#: src/err-codes.h:108
+msgid "Unspecific Assuan server fault"
+msgstr "Ðеуточненный отказ Ñервера Assuan"
+
+#: src/err-codes.h:109
+msgid "General Assuan error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Assuan"
+
+#: src/err-codes.h:110
+msgid "Invalid session key"
+msgstr "ÐедопуÑтимый ÑеанÑовый ключ"
+
+#: src/err-codes.h:111
+msgid "Invalid S-expression"
+msgstr "ÐедопуÑтимое S-выражение"
+
+#: src/err-codes.h:112
+msgid "Unsupported algorithm"
+msgstr "Ðлгоритм не поддерживаетÑÑ"
+
+#: src/err-codes.h:113
+msgid "No pinentry"
+msgstr "Ðет Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð²Ð¾Ð´Ð° PIN"
+
+#: src/err-codes.h:114
+msgid "pinentry error"
+msgstr "ошибка ввода PIN"
+
+#: src/err-codes.h:115
+msgid "Bad PIN"
+msgstr "Плохой PIN"
+
+#: src/err-codes.h:116
+msgid "Invalid name"
+msgstr "ÐедопуÑтимое имÑ"
+
+#: src/err-codes.h:117
+msgid "Bad data"
+msgstr "Плохие данные"
+
+#: src/err-codes.h:118
+msgid "Invalid parameter"
+msgstr "ÐедопуÑтимый параметр"
+
+#: src/err-codes.h:119
+msgid "Wrong card"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"
+
+#: src/err-codes.h:120
+msgid "No dirmngr"
+msgstr "Ðет dirmngr"
+
+#: src/err-codes.h:121
+msgid "dirmngr error"
+msgstr "ошибка dirmngr"
+
+#: src/err-codes.h:122
+msgid "Certificate revoked"
+msgstr "Сертификат отозван"
+
+#: src/err-codes.h:123
+msgid "No CRL known"
+msgstr "СпиÑок отозванных Ñертификатов неизвеÑтен"
+
+#: src/err-codes.h:124
+msgid "CRL too old"
+msgstr "СпиÑок отозванных Ñертификатов Ñлишком Ñтар"
+
+#: src/err-codes.h:125
+msgid "Line too long"
+msgstr "Слишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока"
+
+#: src/err-codes.h:126
+msgid "Not trusted"
+msgstr "Ðе доверенный"
+
+#: src/err-codes.h:127
+msgid "Operation cancelled"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°"
+
+#: src/err-codes.h:128
+msgid "Bad CA certificate"
+msgstr "Плохой Ñертификат центра Ñертификации"
+
+#: src/err-codes.h:129
+msgid "Certificate expired"
+msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата иÑтек"
+
+#: src/err-codes.h:130
+msgid "Certificate too young"
+msgstr "Сертификат Ñлишком новый"
+
+#: src/err-codes.h:131
+msgid "Unsupported certificate"
+msgstr "Сертификат не поддерживаетÑÑ"
+
+#: src/err-codes.h:132
+msgid "Unknown S-expression"
+msgstr "ÐеизвеÑтное S-выражение"
+
+#: src/err-codes.h:133
+msgid "Unsupported protection"
+msgstr "Защита не поддерживаетÑÑ"
+
+#: src/err-codes.h:134
+msgid "Corrupted protection"
+msgstr "Повреждение защиты"
+
+#: src/err-codes.h:135
+msgid "Ambiguous name"
+msgstr "Ðеоднозначное имÑ"
+
+#: src/err-codes.h:136
+msgid "Card error"
+msgstr "Ошибка карты"
+
+#: src/err-codes.h:137
+msgid "Card reset required"
+msgstr "ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк карты"
+
+#: src/err-codes.h:138
+msgid "Card removed"
+msgstr "Карта удалена"
+
+#: src/err-codes.h:139
+msgid "Invalid card"
+msgstr "ÐÐµÐ¿Ñ€Ð¸Ð³Ð¾Ð´Ð½Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð°"
+
+#: src/err-codes.h:140
+msgid "Card not present"
+msgstr "Карта отÑутÑтвует"
+
+#: src/err-codes.h:141
+msgid "No PKCS15 application"
+msgstr "Ðет Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ PKCS15"
+
+#: src/err-codes.h:142
+msgid "Not confirmed"
+msgstr "Ðет подтверждениÑ"
+
+#: src/err-codes.h:143
+msgid "Configuration error"
+msgstr "Ошибка конфигурации"
+
+#: src/err-codes.h:144
+msgid "No policy match"
+msgstr "Проблема Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸"
+
+#: src/err-codes.h:145
+msgid "Invalid index"
+msgstr "ÐедопуÑтимый индекÑ"
+
+#: src/err-codes.h:146
+msgid "Invalid ID"
+msgstr "ÐедопуÑтимый идентификатор"
+
+#: src/err-codes.h:147
+msgid "No SmartCard daemon"
+msgstr "Ðет демона Ñмарткарт"
+
+#: src/err-codes.h:148
+msgid "SmartCard daemon error"
+msgstr "Ошибка демона Ñмарткарт"
+
+#: src/err-codes.h:149
+msgid "Unsupported protocol"
+msgstr "Протокол не поддерживаетÑÑ"
+
+#: src/err-codes.h:150
+msgid "Bad PIN method"
+msgstr "Плохой метод PIN"
+
+#: src/err-codes.h:151
+msgid "Card not initialized"
+msgstr "Карта не инициализирована"
+
+#: src/err-codes.h:152
+msgid "Unsupported operation"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ"
+
+#: src/err-codes.h:153
+msgid "Wrong key usage"
+msgstr "Ðеверное применение ключей"
+
+#: src/err-codes.h:154
+msgid "Nothing found"
+msgstr "Ðичего не найдено"
+
+#: src/err-codes.h:155
+msgid "Wrong blob type"
+msgstr "КуÑок неподходÑщего типа"
+
+#: src/err-codes.h:156
+msgid "Missing value"
+msgstr "Ðе хватает значениÑ"
+
+#: src/err-codes.h:157
+msgid "Hardware problem"
+msgstr "ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°"
+
+#: src/err-codes.h:158
+msgid "PIN blocked"
+msgstr "PIN заблокирован"
+
+#: src/err-codes.h:159
+msgid "Conditions of use not satisfied"
+msgstr "Ðарушены уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ"
+
+#: src/err-codes.h:160
+msgid "PINs are not synced"
+msgstr "Разные PIN не Ñинхронизированы"
+
+#: src/err-codes.h:161
+msgid "Invalid CRL"
+msgstr "ÐедопуÑтимый ÑпиÑок отозванных Ñертификатов"
+
+#: src/err-codes.h:162
+msgid "BER error"
+msgstr "Ошибка BER"
+
+#: src/err-codes.h:163
+msgid "Invalid BER"
+msgstr "ÐедопуÑтимый BER"
+
+#: src/err-codes.h:164
+msgid "Element not found"
+msgstr "Элемент не найден"
+
+#: src/err-codes.h:165
+msgid "Identifier not found"
+msgstr "Идентификатор не найден"
+
+#: src/err-codes.h:166
+msgid "Invalid tag"
+msgstr "ÐедопуÑтимый тег"
+
+#: src/err-codes.h:167
+msgid "Invalid length"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð»Ð¸Ð½Ð°"
+
+#: src/err-codes.h:168
+msgid "Invalid key info"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð°"
+
+#: src/err-codes.h:169
+msgid "Unexpected tag"
+msgstr "Ðеожиданный тег"
+
+#: src/err-codes.h:170
+msgid "Not DER encoded"
+msgstr "Ðе закодировано по DER"
+
+#: src/err-codes.h:171
+msgid "No CMS object"
+msgstr "Ðет объекта CMS"
+
+#: src/err-codes.h:172
+msgid "Invalid CMS object"
+msgstr "ÐедопуÑтимый объект CMS"
+
+#: src/err-codes.h:173
+msgid "Unknown CMS object"
+msgstr "ÐеизвеÑтный объект CMS"
+
+#: src/err-codes.h:174
+msgid "Unsupported CMS object"
+msgstr "Объект CMS не поддерживаетÑÑ"
+
+#: src/err-codes.h:175
+msgid "Unsupported encoding"
+msgstr "Кодировка не поддерживаетÑÑ"
+
+#: src/err-codes.h:176
+msgid "Unsupported CMS version"
+msgstr "ВерÑÐ¸Ñ CMS не поддерживаетÑÑ"
+
+#: src/err-codes.h:177
+msgid "Unknown algorithm"
+msgstr "ÐеизвеÑтный алгоритм"
+
+#: src/err-codes.h:178
+msgid "Invalid crypto engine"
+msgstr "ÐедопуÑтимый криптомеханизм"
+
+#: src/err-codes.h:179
+msgid "Public key not trusted"
+msgstr "Открытый ключ не доверенный"
+
+#: src/err-codes.h:180
+msgid "Decryption failed"
+msgstr "Сбой раÑшифровки"
+
+#: src/err-codes.h:181
+msgid "Key expired"
+msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° иÑтек"
+
+#: src/err-codes.h:182
+msgid "Signature expired"
+msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи иÑтек"
+
+#: src/err-codes.h:183
+msgid "Encoding problem"
+msgstr "Проблема Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹"
+
+#: src/err-codes.h:184
+msgid "Invalid state"
+msgstr "ÐедопуÑтимое ÑоÑтоÑние"
+
+#: src/err-codes.h:185
+msgid "Duplicated value"
+msgstr "Величина продублирована"
+
+#: src/err-codes.h:186
+msgid "Missing action"
+msgstr "Ðе хватает дейÑтвиÑ"
+
+#: src/err-codes.h:187
+msgid "ASN.1 module not found"
+msgstr "Модуль ASN.1 не найден"
+
+#: src/err-codes.h:188
+msgid "Invalid OID string"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñтрока OID"
+
+#: src/err-codes.h:189
+msgid "Invalid time"
+msgstr "ÐедопуÑтимое времÑ"
+
+#: src/err-codes.h:190
+msgid "Invalid CRL object"
+msgstr "ÐедопуÑтимый объект ÑпиÑка отозванных Ñертификатов"
+
+#: src/err-codes.h:191
+msgid "Unsupported CRL version"
+msgstr "ВерÑÐ¸Ñ ÑпиÑка отозванных Ñертификатов не поддерживаетÑÑ"
+
+#: src/err-codes.h:192
+msgid "Invalid certificate object"
+msgstr "ÐедопуÑтимый объект Ñертификата"
+
+#: src/err-codes.h:193
+msgid "Unknown name"
+msgstr "ÐеизвеÑтное имÑ"
+
+#: src/err-codes.h:194
+msgid "A locale function failed"
+msgstr "Сбой функции локализации"
+
+#: src/err-codes.h:195
+msgid "Not locked"
+msgstr "Ðет блокировки"
+
+#: src/err-codes.h:196
+msgid "Protocol violation"
+msgstr "Ðарушение протокола"
+
+#: src/err-codes.h:197
+msgid "Invalid MAC"
+msgstr "ÐедопуÑтимый MAC"
+
+#: src/err-codes.h:198
+msgid "Invalid request"
+msgstr "ÐедопуÑтимый запроÑ"
+
+#: src/err-codes.h:199
+msgid "Unknown extension"
+msgstr "ÐеизвеÑтное раÑширение"
+
+#: src/err-codes.h:200
+msgid "Unknown critical extension"
+msgstr "ÐеизвеÑтное критичеÑкое раÑширение"
+
+#: src/err-codes.h:201
+msgid "Locked"
+msgstr "Заблокировано"
+
+#: src/err-codes.h:202
+msgid "Unknown option"
+msgstr "ÐеизвеÑтный параметр"
+
+#: src/err-codes.h:203
+msgid "Unknown command"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: src/err-codes.h:204
+msgid "Not operational"
+msgstr "Ðе работоÑпоÑобно"
+
+#: src/err-codes.h:205
+msgid "No passphrase given"
+msgstr "Фраза-пароль не задана"
+
+#: src/err-codes.h:206
+msgid "No PIN given"
+msgstr "PIN не задан"
+
+#: src/err-codes.h:207
+msgid "Not enabled"
+msgstr "Отключено"
+
+#: src/err-codes.h:208
+msgid "No crypto engine"
+msgstr "Ðет криптомеханизма"
+
+#: src/err-codes.h:209
+msgid "Missing key"
+msgstr "Ðе хватает ключа"
+
+#: src/err-codes.h:210
+msgid "Too many objects"
+msgstr "Слишком много объектов"
+
+#: src/err-codes.h:211
+msgid "Limit reached"
+msgstr "ДоÑтигнут предел"
+
+#: src/err-codes.h:212
+msgid "Not initialized"
+msgstr "Ðе инициализировано"
+
+#: src/err-codes.h:213
+msgid "Missing issuer certificate"
+msgstr "Ðе хватает Ñертификата издателÑ"
+
+#: src/err-codes.h:214
+msgid "No keyserver available"
+msgstr "Серверы ключей недоÑтупны"
+
+#: src/err-codes.h:215
+msgid "Invalid elliptic curve"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ ÑллиптичеÑÐºÐ°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ"
+
+#: src/err-codes.h:216
+msgid "Unknown elliptic curve"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑллиптичеÑÐºÐ°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ"
+
+#: src/err-codes.h:217
+msgid "Duplicated key"
+msgstr "Ключ продублирован"
+
+#: src/err-codes.h:218
+msgid "Ambiguous result"
+msgstr "Ðеоднозначный результат"
+
+#: src/err-codes.h:219
+msgid "No crypto context"
+msgstr "Ðет криптоконтекÑта"
+
+#: src/err-codes.h:220
+msgid "Wrong crypto context"
+msgstr "Ðеверный криптоконтекÑÑ‚"
+
+#: src/err-codes.h:221
+msgid "Bad crypto context"
+msgstr "Плохой криптоконтекÑÑ‚"
+
+#: src/err-codes.h:222
+msgid "Conflict in the crypto context"
+msgstr "Противоречивый криптоконтекÑÑ‚"
+
+#: src/err-codes.h:223
+msgid "Broken public key"
+msgstr "Открытый ключ поврежден"
+
+#: src/err-codes.h:224
+msgid "Broken secret key"
+msgstr "Закрытый ключ поврежден"
+
+#: src/err-codes.h:225
+msgid "Invalid MAC algorithm"
+msgstr "ÐедопуÑтимый алгоритм MAC"
+
+#: src/err-codes.h:226
+msgid "Operation fully cancelled"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью отменена"
+
+#: src/err-codes.h:227
+msgid "Operation not yet finished"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ ÐµÑ‰Ðµ не завершена"
+
+#: src/err-codes.h:228
+msgid "Buffer too short"
+msgstr "Слишком короткий буфер"
+
+#: src/err-codes.h:229
+msgid "Invalid length specifier in S-expression"
+msgstr "ÐедопуÑтимый Ñпецификатор длины в S-выражении"
+
+#: src/err-codes.h:230
+msgid "String too long in S-expression"
+msgstr "Слишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока в S-выражении"
+
+#: src/err-codes.h:231
+msgid "Unmatched parentheses in S-expression"
+msgstr "Ðепарные Ñкобки в S-выражении"
+
+#: src/err-codes.h:232
+msgid "S-expression not canonical"
+msgstr "S-выражение неканонично"
+
+#: src/err-codes.h:233
+msgid "Bad character in S-expression"
+msgstr "Плохой Ñимвол в S-выражении"
+
+#: src/err-codes.h:234
+msgid "Bad quotation in S-expression"
+msgstr "Плохие кавычки в S-выражении"
+
+#: src/err-codes.h:235
+msgid "Zero prefix in S-expression"
+msgstr "Ðулевой Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² S-выражении"
+
+#: src/err-codes.h:236
+msgid "Nested display hints in S-expression"
+msgstr "Вложенные квадратные Ñкобки в S-выражении"
+
+#: src/err-codes.h:237
+msgid "Unmatched display hints"
+msgstr "Ðепарные квадратные Ñкобки"
+
+#: src/err-codes.h:238
+msgid "Unexpected reserved punctuation in S-expression"
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿ÑƒÐ½ÐºÑ‚ÑƒÐ°Ñ†Ð¸Ð¸ в S-выражении"
+
+#: src/err-codes.h:239
+msgid "Bad hexadecimal character in S-expression"
+msgstr "Плохой шеÑтнадцатеричный Ñимвол в S-выражении"
+
+#: src/err-codes.h:240
+msgid "Odd hexadecimal numbers in S-expression"
+msgstr "ШеÑтнадцатеричные чиÑла нечетной длины в S-выражении"
+
+#: src/err-codes.h:241
+msgid "Bad octal character in S-expression"
+msgstr "Плохой воÑьмеричный Ñимвол в S-выражении"
+
+#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr ""
+
+#: src/err-codes.h:243
+#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Данные не зашифрованы"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "ÐеизвеÑтное имÑ"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Ðет открытого ключа"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr "Старый ключ"
+
+#: src/err-codes.h:248
+msgid "Request too short"
+msgstr "Слишком короткий запроÑ"
+
+#: src/err-codes.h:249
+msgid "Request too long"
+msgstr "Слишком длинный запроÑ"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr "Объект прекращает работу"
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Ðет Ñертификатной цепи"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Сертификат Ñлишком велик"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "MAC не проходит проверку"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Ðеожиданное Ñообщение"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Сбой ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¸Ð»Ð¸ извлечениÑ"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Было бы переполнение Ñчетчика"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Получено критичеÑкое предупреждение"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Ðет алгоритма Ñимметричного шифрованиÑ"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Ðе хватает Ñертификата клиента"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Получено уведомление о завершении"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ²Ð¸Ñ‚Ð°Ð½Ñ†Ð¸Ð¸ иÑтек"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ ÐºÐ²Ð¸Ñ‚Ð°Ð½Ñ†Ð¸Ñ"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "ЛичноÑÑ‚ÑŒ неизвеÑтна"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Плохое Ñертификатное Ñообщение при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "Плохое Ñообщение-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñертификата при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "Плохое Ñообщение-проверка Ñертификата при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Плохое Ñообщение Ñмены шифра при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Плохое начальное Ñообщение клиента при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Плохое начальное Ñообщение Ñервера при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "ÐŸÐ»Ð¾Ñ…Ð°Ñ ÐºÐ²Ð¸Ñ‚Ð°Ð½Ñ†Ð¸Ñ Ñервера на начальное Ñообщение при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Плохое завершающее Ñообщение при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "Плохое Ñообщение обмена ключами Ñервера при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "Плохое Ñообщение обмена ключами клиента при уÑтановлении ÑвÑзи"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "ÐеÑÑƒÑ€Ð°Ð·Ð½Ð°Ñ Ñтрока"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr "Запрещено"
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Ключ отключен"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Ðевозможно Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° на карте"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "ÐедопуÑтимый объект блокировки"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° IPC"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "Сбой принÑÑ‚Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° IPC"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "Сбой вызова ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ IPC"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "ÐедопуÑтимый ответ IPC"
+
+#: src/err-codes.h:286
+msgid "Invalid value passed to IPC"
+msgstr "Ð’ IPC передано недопуÑтимое значение"
+
+#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr "Ð’ IPC передана Ð½ÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтрока"
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr "Ð’ IPC передана Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока"
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr "Вложенные команды IPC"
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr "В IPC нет функции обработки данных"
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr "Ð’ IPC нет функции обработки запроÑа"
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr "Ðе Ñервер IPC"
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr "Ðе клиент IPC"
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr "Проблема запуÑка Ñервера IPC"
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ IPC"
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr "Ошибка запиÑи IPC"
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr "Слишком много данных Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ IPC"
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr "ÐÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° IPC"
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° IPC"
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° IPC"
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr "Вызов IPC отменен"
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr "Ðет иÑточника входа Ð´Ð»Ñ IPC"
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr "Ðет иÑточника выхода Ð´Ð»Ñ IPC"
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr "Ошибка в параметре IPC"
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr "ÐеизвеÑтный Ð·Ð°Ð¿Ñ€Ð¾Ñ IPC"
+
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Ðет криптомеханизма"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "User ID already exists"
+msgstr "Уже еÑÑ‚ÑŒ (LDAP)"
+
+#: src/err-codes.h:311
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "Name already exists"
+msgstr "Уже еÑÑ‚ÑŒ (LDAP)"
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Величина продублирована"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Сертификат Ñлишком новый"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Введенный объект Ñлишком мал"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "ÐеизвеÑтное имÑ"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "ÐедопуÑтимый код операции"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "ÐеизвеÑтное имÑ"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñтрока OID"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "ÐедопуÑтимое S-выражение"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Ðе хватает Ñертификата издателÑ"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Сбой раÑшифровки"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Лимит времени"
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° LDAP"
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в атрибуте LDAP"
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в имени LDAP"
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° безопаÑноÑти LDAP"
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñлужбы LDAP"
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ LDAP"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr "ЭкÑпериментальный код ошибки LDAP"
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr "Внутренний код ошибки LDAP"
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr "Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¾Ð±Ñ‰Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° LDAP"
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr "Отказ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ LDAP (X)"
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr "ИÑчерпан лимит ÑÑылок LDAP"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr "Цикл клиента LDAP"
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr "Ðет результатов LDAP"
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr "Элемент ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LDAP не найден"
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr "Ðе поддерживаетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ LDAP"
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr "Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ LDAP"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr "ИÑчерпана памÑÑ‚ÑŒ в LDAP"
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr "Ðеверный параметр процедуры LDAP"
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr "Пользователь отменил операцию LDAP"
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr "Плохой фильтр поиÑка LDAP"
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr "ÐеизвеÑтный метод аутентификации LDAP"
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr "Лимит времени в LDAP"
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr "Ошибка Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ LDAP"
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr "Ошибка ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ LDAP"
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° LDAP"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr "Ðе удалоÑÑŒ ÑвÑзатьÑÑ Ñ Ñервером LDAP"
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr "УÑпешное выполнение LDAP"
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr "Ошибка операций LDAP"
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr "Ошибка протокола LDAP"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr "ИÑчерпан лимит времени в LDAP"
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr "ИÑчерпан лимит размера в LDAP"
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr "Сравнение LDAP: ложь"
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr "Сравнение LDAP: иÑтина"
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr "Метод аутентификации LDAP не поддерживаетÑÑ"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr "ТребуетÑÑ (более) ÑÐ¸Ð»ÑŒÐ½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ LDAP"
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr "Получены чаÑтичные результаты LDAP Ñо ÑÑылкой"
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr "СÑылка LDAP"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr "ИÑчерпан админиÑтративный лимит LDAP"
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr "ÐедоÑтупно критичное раÑширение LDAP"
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr "КонфиденциальноÑÑ‚ÑŒ, Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ LDAP"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr "ВыполнÑетÑÑ ÑвÑзка SASL LDAP"
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr "Такого атрибута LDAP нет"
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr "Ðеопределенный тип атрибута LDAP"
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr "ÐеподходÑщее ÑоответÑтвие в LDAP"
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr "Ðарушение ограничений в LDAP"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr "Тип или значение LDAP ÑущеÑтвует"
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr "Ошибка ÑинтакÑиÑа в LDAP"
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr "Такого объекта LDAP нет"
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr "Проблема Ñинонима LDAP"
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ошибка ÑинтакÑиÑа DN в LDAP"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr "Элемент LDAP - лиÑÑ‚"
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr "Проблема Ñ€Ð°Ð·Ñ‹Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñинонима LDAP"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr "Отказ авторизации промежуточного Ñервера (X)"
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr "ÐеподходÑÑ‰Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ LDAP"
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð²ÐµÑ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð°Ð¼Ð¾Ñ‚Ð° LDAP"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr "ÐедоÑтаточный доÑтуп Ð´Ð»Ñ LDAP"
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr "Сервер LDAP занÑÑ‚"
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr "Сервер LDAP недоÑтупен"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr "Сервер LDAP отказываетÑÑ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ"
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr "Функцией LDAP обнаружен цикл"
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr "Ðарушение в именах LDAP"
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr "Ðарушение в клаÑÑе объекта LDAP"
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ LDAP допуÑтима только Ð´Ð»Ñ Ð»Ð¸Ñтов"
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ LDAP над RDN не разрешена"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr "Уже еÑÑ‚ÑŒ (LDAP)"
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr "Ðевозможно изменить клаÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° LDAP"
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr "Слишком большой объем результатов LDAP"
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ LDAP влиÑет на многие DSA"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr "Ошибка проÑмотра виртуального ÑпиÑка LDAP"
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr "Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° LDAP"
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr "Ðехватка реÑурÑов в LCUP"
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr "Ðарушение безопаÑноÑти в LCUP"
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr "ÐедопуÑтимые данные в LCUP"
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr "Схема не поддерживаетÑÑ Ð² LCUP"
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr "ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк в LCUP"
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr "Отбой LDAP"
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr "Ðет операции LDAP, которую можно было бы отменить"
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr "ОтменÑÑ‚ÑŒ LDAP Ñлишком поздно"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ LDAP"
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr "Отказ в уÑтановке LDAP"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr "LDAP отказал в опоÑредованной авторизации"
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr "ПользовательÑкий код ошибки 1"
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr "ПользовательÑкий код ошибки 2"
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr "ПользовательÑкий код ошибки 3"
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr "ПользовательÑкий код ошибки 4"
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr "ПользовательÑкий код ошибки 5"
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr "ПользовательÑкий код ошибки 6"
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr "ПользовательÑкий код ошибки 7"
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr "ПользовательÑкий код ошибки 8"
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr "ПользовательÑкий код ошибки 9"
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr "ПользовательÑкий код ошибки 10"
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr "ПользовательÑкий код ошибки 11"
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr "ПользовательÑкий код ошибки 12"
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr "ПользовательÑкий код ошибки 13"
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr "ПользовательÑкий код ошибки 14"
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr "ПользовательÑкий код ошибки 15"
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr "ПользовательÑкий код ошибки 16"
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° без номера"
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr "Конец файла"
+
+#: src/err-codes.h:429
+msgid "Unknown error code"
+msgstr "ÐеизвеÑтный код ошибки"
+
+#: src/gpg-error.c:450
+#, c-format
+msgid "Usage: %s GPG-ERROR [...]\n"
+msgstr "Вызов: %s GPG-ERROR [...]\n"
+
+#: src/gpg-error.c:633
+#, c-format
+msgid "%s: warning: could not recognize %s\n"
+msgstr "%s: внимание: не раÑпознано %s\n"
diff --git a/po/sr.gmo b/po/sr.gmo
new file mode 100644
index 0000000..bfd4759
--- /dev/null
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..08c57a2
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,1954 @@
+# Serbian translation for libgpg-error.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This file is distributed under the same license as the libgpg-error package.
+# МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: libgpg-error-1.7\n"
+"Report-Msgid-Bugs-To: translations@gnupg.org\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-03 11:42+0200\n"
+"Last-Translator: МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>\n"
+"Language-Team: Serbian <(nothing)>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/err-sources.h:28
+msgid "Unspecified source"
+msgstr "Ðенаведени извор"
+
+#: src/err-sources.h:29
+msgid "gcrypt"
+msgstr "гкрипт"
+
+#: src/err-sources.h:30
+msgid "GnuPG"
+msgstr "ГнуПГ"
+
+#: src/err-sources.h:31
+msgid "GpgSM"
+msgstr "ГпгСМ"
+
+#: src/err-sources.h:32
+msgid "GPG Agent"
+msgstr "ГПГ агент"
+
+#: src/err-sources.h:33
+msgid "Pinentry"
+msgstr "Ð£Ð½Ð¾Ñ Ð¿Ð¸Ð½Ð°"
+
+#: src/err-sources.h:34
+msgid "SCD"
+msgstr "СЦД"
+
+#: src/err-sources.h:35
+msgid "GPGME"
+msgstr "ГПГМЕ"
+
+#: src/err-sources.h:36
+msgid "Keybox"
+msgstr "Поље кључа"
+
+#: src/err-sources.h:37
+msgid "KSBA"
+msgstr "КСБÐ"
+
+#: src/err-sources.h:38
+msgid "Dirmngr"
+msgstr "Управник директоријума"
+
+#: src/err-sources.h:39
+msgid "GSTI"
+msgstr "ГСТИ"
+
+#: src/err-sources.h:40
+msgid "GPA"
+msgstr "ГПÐ"
+
+#: src/err-sources.h:41
+msgid "Kleopatra"
+msgstr "Клеопатра"
+
+#: src/err-sources.h:42
+msgid "G13"
+msgstr ""
+
+#: src/err-sources.h:43
+msgid "Assuan"
+msgstr ""
+
+#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
+msgid "Any source"
+msgstr "Било који извор"
+
+#: src/err-sources.h:46
+msgid "User defined source 1"
+msgstr "1. кориÑников извор"
+
+#: src/err-sources.h:47
+msgid "User defined source 2"
+msgstr "2. кориÑников извор"
+
+#: src/err-sources.h:48
+msgid "User defined source 3"
+msgstr "3. кориÑников извор"
+
+#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr "4. кориÑников извор"
+
+#: src/err-sources.h:50
+msgid "Unknown source"
+msgstr "Ðепознат извор"
+
+#: src/err-codes.h:28
+msgid "Success"
+msgstr "УÑпешно"
+
+#: src/err-codes.h:29
+msgid "General error"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:30
+msgid "Unknown packet"
+msgstr "Ðепознат пакет"
+
+#: src/err-codes.h:31
+msgid "Unknown version in packet"
+msgstr "Ðепознато издање у пакету"
+
+#: src/err-codes.h:32
+msgid "Invalid public key algorithm"
+msgstr "ÐеиÑправан алгоритам јавног кључа"
+
+#: src/err-codes.h:33
+msgid "Invalid digest algorithm"
+msgstr "Ðепознат алгоритам апÑорпције"
+
+#: src/err-codes.h:34
+msgid "Bad public key"
+msgstr "Лош јавни кључ"
+
+#: src/err-codes.h:35
+msgid "Bad secret key"
+msgstr "Лош тајни кључ"
+
+#: src/err-codes.h:36
+msgid "Bad signature"
+msgstr "Лош потпиÑ"
+
+#: src/err-codes.h:37
+msgid "No public key"
+msgstr "Ðема јавног кључа"
+
+#: src/err-codes.h:38
+msgid "Checksum error"
+msgstr "Грешка провере Ñуме"
+
+#: src/err-codes.h:39
+msgid "Bad passphrase"
+msgstr "Лоша пропуÑна реч"
+
+#: src/err-codes.h:40
+msgid "Invalid cipher algorithm"
+msgstr "ÐеиÑправан алгоритам шифровања"
+
+#: src/err-codes.h:41
+msgid "Cannot open keyring"
+msgstr "Привезак кључева је отворен"
+
+#: src/err-codes.h:42
+msgid "Invalid packet"
+msgstr "ÐеиÑправан пакет"
+
+#: src/err-codes.h:43
+msgid "Invalid armor"
+msgstr "ÐеиÑправан штит"
+
+#: src/err-codes.h:44
+msgid "No user ID"
+msgstr "Ðема ИБ-а кориÑника"
+
+#: src/err-codes.h:45
+msgid "No secret key"
+msgstr "Ðема тајног кључа"
+
+#: src/err-codes.h:46
+msgid "Wrong secret key used"
+msgstr "Коришћен је погрешан тајни кључ"
+
+#: src/err-codes.h:47
+msgid "Bad session key"
+msgstr "Лош кључ ÑеÑије"
+
+#: src/err-codes.h:48
+msgid "Unknown compression algorithm"
+msgstr "Ðепознат алгоритам Ñажимања"
+
+#: src/err-codes.h:49
+msgid "Number is not prime"
+msgstr "Број није проÑÑ‚"
+
+#: src/err-codes.h:50
+msgid "Invalid encoding method"
+msgstr "ÐеиÑправан начин кодирања"
+
+#: src/err-codes.h:51
+msgid "Invalid encryption scheme"
+msgstr "ÐеиÑправна шема шифровања"
+
+#: src/err-codes.h:52
+msgid "Invalid signature scheme"
+msgstr "ÐеиÑправна шема потпиÑа"
+
+#: src/err-codes.h:53
+msgid "Invalid attribute"
+msgstr "ÐеиÑправна оÑобина"
+
+#: src/err-codes.h:54
+msgid "No value"
+msgstr "Ðема вредноÑти"
+
+#: src/err-codes.h:55
+msgid "Not found"
+msgstr "ÐиÑам пронашао"
+
+#: src/err-codes.h:56
+msgid "Value not found"
+msgstr "ÐиÑам пронашао вредноÑÑ‚"
+
+#: src/err-codes.h:57
+msgid "Syntax error"
+msgstr "Садржајна грешка"
+
+#: src/err-codes.h:58
+msgid "Bad MPI value"
+msgstr "Лоша МПИ вредноÑÑ‚"
+
+#: src/err-codes.h:59
+msgid "Invalid passphrase"
+msgstr "ÐеиÑправна пропуÑна реч"
+
+#: src/err-codes.h:60
+msgid "Invalid signature class"
+msgstr "ÐеиÑправан разред потпиÑа"
+
+#: src/err-codes.h:61
+msgid "Resources exhausted"
+msgstr "Изворишта Ñу иÑтрошена"
+
+#: src/err-codes.h:62
+msgid "Invalid keyring"
+msgstr "ÐеиÑправан прÑтен кључа"
+
+#: src/err-codes.h:63
+msgid "Trust DB error"
+msgstr "Грешка поверења БП-а"
+
+#: src/err-codes.h:64
+msgid "Bad certificate"
+msgstr "Лош уверење"
+
+#: src/err-codes.h:65
+msgid "Invalid user ID"
+msgstr "ÐеиÑправан ИБ-а кориÑника"
+
+#: src/err-codes.h:66
+msgid "Unexpected error"
+msgstr "Ðеочекивана грешка"
+
+#: src/err-codes.h:67
+msgid "Time conflict"
+msgstr "Сукоб времена"
+
+#: src/err-codes.h:68
+msgid "Keyserver error"
+msgstr "Грешка Ñервера кључа"
+
+#: src/err-codes.h:69
+msgid "Wrong public key algorithm"
+msgstr "Погрешан алгоритам јавног кључа"
+
+#: src/err-codes.h:70
+msgid "Tribute to D. A."
+msgstr "У чаÑÑ‚ Д. Ð."
+
+#: src/err-codes.h:71
+msgid "Weak encryption key"
+msgstr "Слаб кључ шифровања"
+
+#: src/err-codes.h:72
+msgid "Invalid key length"
+msgstr "ÐеиÑправна дужина кључа"
+
+#: src/err-codes.h:73
+msgid "Invalid argument"
+msgstr "ÐеиÑправан аргумент"
+
+#: src/err-codes.h:74
+msgid "Syntax error in URI"
+msgstr "Грешка израза у путањи"
+
+#: src/err-codes.h:75
+msgid "Invalid URI"
+msgstr "ÐеиÑправна путања"
+
+#: src/err-codes.h:76
+msgid "Network error"
+msgstr "Грешка мреже"
+
+#: src/err-codes.h:77
+msgid "Unknown host"
+msgstr "Ðепознат домаћин"
+
+#: src/err-codes.h:78
+msgid "Selftest failed"
+msgstr "Самопроба није уÑпела"
+
+#: src/err-codes.h:79
+msgid "Data not encrypted"
+msgstr "Подаци ниÑу шифровани"
+
+#: src/err-codes.h:80
+msgid "Data not processed"
+msgstr "Подаци ниÑу обрађени"
+
+#: src/err-codes.h:81
+msgid "Unusable public key"
+msgstr "Ðеупотребљив јавни кључ"
+
+#: src/err-codes.h:82
+msgid "Unusable secret key"
+msgstr "Ðеупотребљив тајни кључ"
+
+#: src/err-codes.h:83
+msgid "Invalid value"
+msgstr "ÐеиÑправна вредноÑÑ‚"
+
+#: src/err-codes.h:84
+msgid "Bad certificate chain"
+msgstr "Лош ланац уверења"
+
+#: src/err-codes.h:85
+msgid "Missing certificate"
+msgstr "ÐедоÑтаје уверење"
+
+#: src/err-codes.h:86
+msgid "No data"
+msgstr "Ðема података"
+
+#: src/err-codes.h:87
+msgid "Bug"
+msgstr "Грешка"
+
+#: src/err-codes.h:88
+msgid "Not supported"
+msgstr "Ðије подржано"
+
+#: src/err-codes.h:89
+msgid "Invalid operation code"
+msgstr "ÐеиÑправна шифра радње"
+
+#: src/err-codes.h:90
+msgid "Timeout"
+msgstr "Време је иÑтекло"
+
+#: src/err-codes.h:91
+msgid "Internal error"
+msgstr "Унутрашња грешка"
+
+#: src/err-codes.h:92
+msgid "EOF (gcrypt)"
+msgstr "КРД (gcrypt)"
+
+#: src/err-codes.h:93
+msgid "Invalid object"
+msgstr "ÐеиÑправан предмет"
+
+#: src/err-codes.h:94
+msgid "Provided object is too short"
+msgstr "ДоÑтављени предмет је прекратак"
+
+#: src/err-codes.h:95
+msgid "Provided object is too large"
+msgstr "ДоÑтављени предмет је предуг"
+
+#: src/err-codes.h:96
+msgid "Missing item in object"
+msgstr "ÐедоÑтаје Ñтавка у предмету"
+
+#: src/err-codes.h:97
+msgid "Not implemented"
+msgstr "Ðије примењено"
+
+#: src/err-codes.h:98
+msgid "Conflicting use"
+msgstr "Противна употреба"
+
+#: src/err-codes.h:99
+msgid "Invalid cipher mode"
+msgstr "ÐеиÑправан код шифрера"
+
+#: src/err-codes.h:100
+msgid "Invalid flag"
+msgstr "ÐеиÑправна опција"
+
+#: src/err-codes.h:101
+msgid "Invalid handle"
+msgstr "ÐеиÑправна ручка"
+
+#: src/err-codes.h:102
+msgid "Result truncated"
+msgstr "Резултат је Ñкраћен"
+
+#: src/err-codes.h:103
+msgid "Incomplete line"
+msgstr "Ðепотпун ред"
+
+#: src/err-codes.h:104
+msgid "Invalid response"
+msgstr "ÐеиÑправан одговор"
+
+#: src/err-codes.h:105
+msgid "No agent running"
+msgstr "Ðема покренутог агента"
+
+#: src/err-codes.h:106
+#, fuzzy
+#| msgid "agent error"
+msgid "Agent error"
+msgstr "грешка агента"
+
+#: src/err-codes.h:107
+msgid "Invalid data"
+msgstr "ÐеиÑправни подаци"
+
+#: src/err-codes.h:108
+msgid "Unspecific Assuan server fault"
+msgstr "Ðеобичан неуÑпех ÐÑуан Ñервера"
+
+#: src/err-codes.h:109
+msgid "General Assuan error"
+msgstr "Општа грешка ÐÑуана"
+
+#: src/err-codes.h:110
+msgid "Invalid session key"
+msgstr "ÐеиÑправан кључ ÑеÑије"
+
+#: src/err-codes.h:111
+msgid "Invalid S-expression"
+msgstr "ÐеиÑправан С-израз"
+
+#: src/err-codes.h:112
+msgid "Unsupported algorithm"
+msgstr "Ðеподржани алгоритам"
+
+#: src/err-codes.h:113
+msgid "No pinentry"
+msgstr "Ðема уноÑа пина"
+
+#: src/err-codes.h:114
+msgid "pinentry error"
+msgstr "грешка уноÑа пина"
+
+#: src/err-codes.h:115
+msgid "Bad PIN"
+msgstr "Лош ПИÐ"
+
+#: src/err-codes.h:116
+msgid "Invalid name"
+msgstr "ÐеиÑправан назив"
+
+#: src/err-codes.h:117
+msgid "Bad data"
+msgstr "Лоши подаци"
+
+#: src/err-codes.h:118
+msgid "Invalid parameter"
+msgstr "ÐеиÑправан параметар"
+
+#: src/err-codes.h:119
+msgid "Wrong card"
+msgstr "Лоша картица"
+
+#: src/err-codes.h:120
+msgid "No dirmngr"
+msgstr "Ðема управника директоријумом"
+
+#: src/err-codes.h:121
+msgid "dirmngr error"
+msgstr "грешка управника директоријумом"
+
+#: src/err-codes.h:122
+msgid "Certificate revoked"
+msgstr "Уверење је опозвано"
+
+#: src/err-codes.h:123
+msgid "No CRL known"
+msgstr "Ðема познатог ЦРЛ-а"
+
+#: src/err-codes.h:124
+msgid "CRL too old"
+msgstr "ЦРЛ је преÑтар"
+
+#: src/err-codes.h:125
+msgid "Line too long"
+msgstr "Ред је предуг"
+
+#: src/err-codes.h:126
+msgid "Not trusted"
+msgstr "Ðије од поверења"
+
+#: src/err-codes.h:127
+msgid "Operation cancelled"
+msgstr "Радња је отказана"
+
+#: src/err-codes.h:128
+msgid "Bad CA certificate"
+msgstr "Лоше уверење издавача"
+
+#: src/err-codes.h:129
+msgid "Certificate expired"
+msgstr "Уверење је иÑтекло"
+
+#: src/err-codes.h:130
+msgid "Certificate too young"
+msgstr "Уверење је превише ново"
+
+#: src/err-codes.h:131
+msgid "Unsupported certificate"
+msgstr "Ðеподржано уверење"
+
+#: src/err-codes.h:132
+msgid "Unknown S-expression"
+msgstr "Ðепознат С-израз"
+
+#: src/err-codes.h:133
+msgid "Unsupported protection"
+msgstr "Ðеподржана заштита"
+
+#: src/err-codes.h:134
+msgid "Corrupted protection"
+msgstr "Оштећена заштита"
+
+#: src/err-codes.h:135
+msgid "Ambiguous name"
+msgstr "ÐејаÑан назив"
+
+#: src/err-codes.h:136
+msgid "Card error"
+msgstr "Грешка картице"
+
+#: src/err-codes.h:137
+msgid "Card reset required"
+msgstr "Потребно је поновно поÑтављање картице"
+
+#: src/err-codes.h:138
+msgid "Card removed"
+msgstr "Картица је уклоњена"
+
+#: src/err-codes.h:139
+msgid "Invalid card"
+msgstr "ÐеиÑправна картица"
+
+#: src/err-codes.h:140
+msgid "Card not present"
+msgstr "Картица није приÑутна"
+
+#: src/err-codes.h:141
+msgid "No PKCS15 application"
+msgstr "Ðема ПКЦС15 програма"
+
+#: src/err-codes.h:142
+msgid "Not confirmed"
+msgstr "Ðије потврђено"
+
+#: src/err-codes.h:143
+msgid "Configuration error"
+msgstr "Грешка подешавања"
+
+#: src/err-codes.h:144
+msgid "No policy match"
+msgstr "Ðема одговарајуће политике"
+
+#: src/err-codes.h:145
+msgid "Invalid index"
+msgstr "ÐеиÑправан индекÑ"
+
+#: src/err-codes.h:146
+msgid "Invalid ID"
+msgstr "ÐеиÑправан ИБ"
+
+#: src/err-codes.h:147
+msgid "No SmartCard daemon"
+msgstr "Ðема позадинца паметне картице"
+
+#: src/err-codes.h:148
+msgid "SmartCard daemon error"
+msgstr "Грешка позадинца паметне картице"
+
+#: src/err-codes.h:149
+msgid "Unsupported protocol"
+msgstr "Ðеподржан протокол"
+
+#: src/err-codes.h:150
+msgid "Bad PIN method"
+msgstr "Лош начин ПИÐ-а"
+
+#: src/err-codes.h:151
+msgid "Card not initialized"
+msgstr "Картица није покренута"
+
+#: src/err-codes.h:152
+msgid "Unsupported operation"
+msgstr "Ðеподржана радња"
+
+#: src/err-codes.h:153
+msgid "Wrong key usage"
+msgstr "Погрешна употреба кључа"
+
+#: src/err-codes.h:154
+msgid "Nothing found"
+msgstr "ÐиÑам нашао ништа"
+
+#: src/err-codes.h:155
+msgid "Wrong blob type"
+msgstr "Погрешна врÑта бвоб-а"
+
+#: src/err-codes.h:156
+msgid "Missing value"
+msgstr "ÐедоÑтаје вредноÑÑ‚"
+
+#: src/err-codes.h:157
+msgid "Hardware problem"
+msgstr "ХардверÑки проблем"
+
+#: src/err-codes.h:158
+msgid "PIN blocked"
+msgstr "ПИРје блокиран"
+
+#: src/err-codes.h:159
+msgid "Conditions of use not satisfied"
+msgstr "УÑлови коришћења ниÑу задовољени"
+
+#: src/err-codes.h:160
+msgid "PINs are not synced"
+msgstr "ПИÐ-ови ниÑу уÑаглашени"
+
+#: src/err-codes.h:161
+msgid "Invalid CRL"
+msgstr "ÐеиÑправан ЦРЛ"
+
+#: src/err-codes.h:162
+msgid "BER error"
+msgstr "Грешка БЕР-а"
+
+#: src/err-codes.h:163
+msgid "Invalid BER"
+msgstr "ÐеиÑправан БЕР"
+
+#: src/err-codes.h:164
+msgid "Element not found"
+msgstr "ÐиÑам пронашао елемент"
+
+#: src/err-codes.h:165
+msgid "Identifier not found"
+msgstr "ÐиÑам пронашао одредника"
+
+#: src/err-codes.h:166
+msgid "Invalid tag"
+msgstr "ÐеиÑправна ознака"
+
+#: src/err-codes.h:167
+msgid "Invalid length"
+msgstr "ÐеиÑправна дужина"
+
+#: src/err-codes.h:168
+msgid "Invalid key info"
+msgstr "ÐеиÑправни подаци кључа"
+
+#: src/err-codes.h:169
+msgid "Unexpected tag"
+msgstr "Ðеочекивана ознака"
+
+#: src/err-codes.h:170
+msgid "Not DER encoded"
+msgstr "Ðије кодирано ДЕР-ом"
+
+#: src/err-codes.h:171
+msgid "No CMS object"
+msgstr "Ðије ЦМС предмет"
+
+#: src/err-codes.h:172
+msgid "Invalid CMS object"
+msgstr "ÐеиÑправан ЦМС предмет"
+
+#: src/err-codes.h:173
+msgid "Unknown CMS object"
+msgstr "Ðепознат ЦМС предмет"
+
+#: src/err-codes.h:174
+msgid "Unsupported CMS object"
+msgstr "Ðеподржан ЦМС предмет"
+
+#: src/err-codes.h:175
+msgid "Unsupported encoding"
+msgstr "Ðеподржано кодирање"
+
+#: src/err-codes.h:176
+msgid "Unsupported CMS version"
+msgstr "Ðеподржано ЦМС издање"
+
+#: src/err-codes.h:177
+msgid "Unknown algorithm"
+msgstr "Ðепознат алгоритам"
+
+#: src/err-codes.h:178
+msgid "Invalid crypto engine"
+msgstr "ÐеиÑправан погон шифровања"
+
+#: src/err-codes.h:179
+msgid "Public key not trusted"
+msgstr "Јавни кључ није поверљив"
+
+#: src/err-codes.h:180
+msgid "Decryption failed"
+msgstr "Дешифровање није уÑпело"
+
+#: src/err-codes.h:181
+msgid "Key expired"
+msgstr "Кључ је иÑтекао"
+
+#: src/err-codes.h:182
+msgid "Signature expired"
+msgstr "ÐŸÐ¾Ñ‚Ð¿Ð¸Ñ Ñ˜Ðµ иÑтекао"
+
+#: src/err-codes.h:183
+msgid "Encoding problem"
+msgstr "Проблем кодирања"
+
+#: src/err-codes.h:184
+msgid "Invalid state"
+msgstr "ÐеиÑправно Ñтање"
+
+#: src/err-codes.h:185
+msgid "Duplicated value"
+msgstr "УдвоÑтручена вредноÑÑ‚"
+
+#: src/err-codes.h:186
+msgid "Missing action"
+msgstr "ÐедоÑтаје радња"
+
+#: src/err-codes.h:187
+msgid "ASN.1 module not found"
+msgstr "ÐиÑам пронашао модул ÐСÐ.1"
+
+#: src/err-codes.h:188
+msgid "Invalid OID string"
+msgstr "ÐеиÑправна ОИД ниÑка"
+
+#: src/err-codes.h:189
+msgid "Invalid time"
+msgstr "ÐеиÑправно време"
+
+#: src/err-codes.h:190
+msgid "Invalid CRL object"
+msgstr "ÐеиÑправан ЦРЛ предмет"
+
+#: src/err-codes.h:191
+msgid "Unsupported CRL version"
+msgstr "Ðеподржано ЦРЛ издање"
+
+#: src/err-codes.h:192
+msgid "Invalid certificate object"
+msgstr "ÐеиÑправан предмет уверења"
+
+#: src/err-codes.h:193
+msgid "Unknown name"
+msgstr "Ðепознат назив"
+
+#: src/err-codes.h:194
+msgid "A locale function failed"
+msgstr "Језичка функција није уÑпела"
+
+#: src/err-codes.h:195
+msgid "Not locked"
+msgstr "Ðије закључано"
+
+#: src/err-codes.h:196
+msgid "Protocol violation"
+msgstr "Кршење протокола"
+
+#: src/err-codes.h:197
+msgid "Invalid MAC"
+msgstr "ÐеиÑправан ÐœÐК"
+
+#: src/err-codes.h:198
+msgid "Invalid request"
+msgstr "ÐеиÑправан захтев"
+
+#: src/err-codes.h:199
+msgid "Unknown extension"
+msgstr "Ðепознато проширење"
+
+#: src/err-codes.h:200
+msgid "Unknown critical extension"
+msgstr "Ðепознат критичан израз"
+
+#: src/err-codes.h:201
+msgid "Locked"
+msgstr "Закључано"
+
+#: src/err-codes.h:202
+msgid "Unknown option"
+msgstr "Ðепозната опција"
+
+#: src/err-codes.h:203
+msgid "Unknown command"
+msgstr "Ðепозната наредба"
+
+#: src/err-codes.h:204
+msgid "Not operational"
+msgstr "Ðије делотворно"
+
+#: src/err-codes.h:205
+msgid "No passphrase given"
+msgstr "Ðије дата пропуÑна реч"
+
+#: src/err-codes.h:206
+msgid "No PIN given"
+msgstr "Ðије дат ПИÐ"
+
+#: src/err-codes.h:207
+#, fuzzy
+#| msgid "Not locked"
+msgid "Not enabled"
+msgstr "Ðије закључано"
+
+#: src/err-codes.h:208
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "No crypto engine"
+msgstr "ÐеиÑправан погон шифровања"
+
+#: src/err-codes.h:209
+#, fuzzy
+#| msgid "Missing value"
+msgid "Missing key"
+msgstr "ÐедоÑтаје вредноÑÑ‚"
+
+#: src/err-codes.h:210
+#, fuzzy
+#| msgid "No CMS object"
+msgid "Too many objects"
+msgstr "Ðије ЦМС предмет"
+
+#: src/err-codes.h:211
+msgid "Limit reached"
+msgstr ""
+
+#: src/err-codes.h:212
+#, fuzzy
+#| msgid "Card not initialized"
+msgid "Not initialized"
+msgstr "Картица није покренута"
+
+#: src/err-codes.h:213
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing issuer certificate"
+msgstr "ÐедоÑтаје уверење"
+
+#: src/err-codes.h:214
+msgid "No keyserver available"
+msgstr ""
+
+#: src/err-codes.h:215
+#, fuzzy
+#| msgid "Invalid time"
+msgid "Invalid elliptic curve"
+msgstr "ÐеиÑправно време"
+
+#: src/err-codes.h:216
+#, fuzzy
+#| msgid "Unknown source"
+msgid "Unknown elliptic curve"
+msgstr "Ðепознат извор"
+
+#: src/err-codes.h:217
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated key"
+msgstr "УдвоÑтручена вредноÑÑ‚"
+
+#: src/err-codes.h:218
+#, fuzzy
+#| msgid "Ambiguous name"
+msgid "Ambiguous result"
+msgstr "ÐејаÑан назив"
+
+#: src/err-codes.h:219
+msgid "No crypto context"
+msgstr ""
+
+#: src/err-codes.h:220
+msgid "Wrong crypto context"
+msgstr ""
+
+#: src/err-codes.h:221
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "Bad crypto context"
+msgstr "ÐеиÑправан погон шифровања"
+
+#: src/err-codes.h:222
+msgid "Conflict in the crypto context"
+msgstr ""
+
+#: src/err-codes.h:223
+#, fuzzy
+#| msgid "No public key"
+msgid "Broken public key"
+msgstr "Ðема јавног кључа"
+
+#: src/err-codes.h:224
+#, fuzzy
+#| msgid "No secret key"
+msgid "Broken secret key"
+msgstr "Ðема тајног кључа"
+
+#: src/err-codes.h:225
+#, fuzzy
+#| msgid "Invalid digest algorithm"
+msgid "Invalid MAC algorithm"
+msgstr "Ðепознат алгоритам апÑорпције"
+
+#: src/err-codes.h:226
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "Operation fully cancelled"
+msgstr "Радња је отказана"
+
+#: src/err-codes.h:227
+msgid "Operation not yet finished"
+msgstr "Радња није још завршена"
+
+#: src/err-codes.h:228
+msgid "Buffer too short"
+msgstr "Међумеморија је прекратка"
+
+#: src/err-codes.h:229
+msgid "Invalid length specifier in S-expression"
+msgstr "ÐеиÑправан одредник дужине у С-изразу"
+
+#: src/err-codes.h:230
+msgid "String too long in S-expression"
+msgstr "ÐиÑка је предуга у С-изразу"
+
+#: src/err-codes.h:231
+msgid "Unmatched parentheses in S-expression"
+msgstr "Ðеодговарајуће заграде у С-изразу"
+
+#: src/err-codes.h:232
+msgid "S-expression not canonical"
+msgstr "С-израз није правилан"
+
+#: src/err-codes.h:233
+msgid "Bad character in S-expression"
+msgstr "Лош знак у С-изразу"
+
+#: src/err-codes.h:234
+msgid "Bad quotation in S-expression"
+msgstr "Лоше цитирање у С-изразу"
+
+#: src/err-codes.h:235
+msgid "Zero prefix in S-expression"
+msgstr "Ðулти Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ñƒ С-изразу"
+
+#: src/err-codes.h:236
+msgid "Nested display hints in S-expression"
+msgstr "Уграђени Ñавети приказа у С-изразу"
+
+#: src/err-codes.h:237
+msgid "Unmatched display hints"
+msgstr "Ðеодговарајући Ñавети приказа"
+
+#: src/err-codes.h:238
+msgid "Unexpected reserved punctuation in S-expression"
+msgstr "Ðеочекивана резервиÑана тачка у С-изразу"
+
+#: src/err-codes.h:239
+msgid "Bad hexadecimal character in S-expression"
+msgstr "Лош хекÑадецимални знак у С-изразу"
+
+#: src/err-codes.h:240
+msgid "Odd hexadecimal numbers in S-expression"
+msgstr "Ðепарни хекÑадецимални бројеви у С-изразу"
+
+#: src/err-codes.h:241
+#, fuzzy
+#| msgid "Bad octadecimal character in S-expression"
+msgid "Bad octal character in S-expression"
+msgstr "Лош октадецимални знак у С-изразу"
+
+#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr ""
+
+#: src/err-codes.h:243
+#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Подаци ниÑу шифровани"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Ðепознат назив"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Ðема јавног кључа"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Међумеморија је прекратка"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Ред је предуг"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "Лош ланац уверења"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Уверење је превише ново"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "ÐеиÑправна картица"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Ðеочекивана ознака"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "ÐеиÑправан алгоритам шифровања"
+
+#: src/err-codes.h:260
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing client certificate"
+msgstr "ÐедоÑтаје уверење"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Уверење је опозвано"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "Кључ је иÑтекао"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "Лош јавни кључ"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Ðепознат пакет"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "Лош ланац уверења"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "Кључ је иÑтекао"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
+#| msgid "Invalid object"
+msgid "Invalid lock object"
+msgstr "ÐеиÑправан предмет"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "Општа грешка ИПЦ-а"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "Прихватање позива ИПЦ-а није уÑпело"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "Повезивање позива ИПЦ-а није уÑпело"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "ÐеиÑправан ИПЦ одговор"
+
+#: src/err-codes.h:286
+msgid "Invalid value passed to IPC"
+msgstr "ÐеиÑправна вредноÑÑ‚ проÑлеђена ИПЦ-у"
+
+#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr "Ðепотпун ред је проÑлеђен ИПЦ-у"
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr "Ред проÑлеђен ИПЦ-у је предуг"
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr "Уграђене ИПЦ наредбе"
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr "Ðема опозива података у ИПЦ-у"
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr "Ðема опозива раÑпитивања у ИПЦ-у"
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr "Ðије ИПЦ Ñервер"
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr "Ðије ИПЦ клијент"
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr "Проблем покретања ИПЦ Ñервера"
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr "Грешка читања ИПЦ-а"
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr "Грешка пиÑања ИПЦ-а"
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr "Превише података за ИПЦ Ñлој"
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr "Ðеочекивана ИПЦ наредба"
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr "Ðепозната ИПЦ наредба"
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr "Садржајна грешка ИПЦ-а"
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr "ИПЦ позив је отказан"
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr "Ðема извора улаза за ИПЦ"
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr "Ðема извора излаза за ИПЦ"
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr "Грешка параметра ИПЦ-а"
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr "Ðепознато раÑпитивање ИПЦ-а"
+
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "Invalid crypto engine"
+msgid "Crypto engine too old"
+msgstr "ÐеиÑправан погон шифровања"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "УдвоÑтручена вредноÑÑ‚"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Уверење је превише ново"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "ДоÑтављени предмет је прекратак"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Ðепознат назив"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "ÐеиÑправна шифра радње"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Ðепознат назив"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Ðепозната грешка ÑиÑтема"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "ÐеиÑправна ОИД ниÑка"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "ÐеиÑправан С-израз"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing certificate"
+msgid "Missing DNS query packet"
+msgstr "ÐедоÑтаје уверење"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Дешифровање није уÑпело"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Време је иÑтекло"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Општа грешка ИПЦ-а"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Општа грешка ÐÑуана"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Општа грешка ÐÑуана"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Грешка пиÑања ИПЦ-а"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Општа грешка ИПЦ-а"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Повезивање позива ИПЦ-а није уÑпело"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Потребно је поновно поÑтављање картице"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "ÐиÑам пронашао елемент"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Ðије подржано"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Ðеочекивана грешка"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Ðеподржана радња"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Лош уверење"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Ðепознато проширење"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Време је иÑтекло"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "грешка управника директоријумом"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "грешка управника директоријумом"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Грешка читања ИПЦ-а"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Ðије ИПЦ Ñервер"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "УÑпешно"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Грешка подешавања"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Кршење протокола"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Ðепознато проширење"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Општа грешка"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Потребно је поновно поÑтављање картице"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "ÐеиÑправна оÑобина"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Ðеподржана заштита"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Кршење протокола"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "ÐеиÑправно Ñтање"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Ðије ЦМС предмет"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "ХардверÑки проблем"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "ÐеиÑправно Ñтање"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Проблем кодирања"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Ðеподржана заштита"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "ÐеиÑправна картица"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "ÐедоÑтаје радња"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Кршење протокола"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Радња није још завршена"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Радња је отказана"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Ред је предуг"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Радња је отказана"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Општа грешка ИПЦ-а"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Изворишта Ñу иÑтрошена"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Кршење протокола"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "ÐеиÑправно Ñтање"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Ðеподржано уверење"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Потребно је поновно поÑтављање картице"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "УÑпешно"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Ðије делотворно"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Ðије делотворно"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Ðије ИПЦ Ñервер"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Дешифровање није уÑпело"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr "1. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr "2. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr "3. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr "4. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr "5. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr "6. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr "7. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr "8. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr "9. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr "10. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr "11. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr "12. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr "13. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr "14. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr "15. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr "16. код грешке који је одредио кориÑник"
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr "Број в/о грешке ÑиÑтемÑке грешке"
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr "Ðепозната грешка ÑиÑтема"
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr "Крај датотеке"
+
+#: src/err-codes.h:429
+msgid "Unknown error code"
+msgstr "Ðепознат код грешке"
+
+#: src/gpg-error.c:450
+#, c-format
+msgid "Usage: %s GPG-ERROR [...]\n"
+msgstr "Употреба: %s GPG-ERROR [...]\n"
+
+#: src/gpg-error.c:633
+#, c-format
+msgid "%s: warning: could not recognize %s\n"
+msgstr "%s: упозорење: не могу да препознам „%s“\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Изворишта Ñу иÑтрошена"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "ÐеиÑправни подаци"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Општа грешка"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "грешка управника директоријумом"
diff --git a/po/sv.gmo b/po/sv.gmo
index 6ac45ff..a239c6e 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 368021f..6493b36 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.7\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: 2013-02-23 20:10+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -81,26 +81,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Alla källor"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Användardefinierad källa 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Användardefinierad källa 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Användardefinierad källa 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Användardefinierad källa 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Okänd källa"
@@ -157,7 +161,7 @@ msgid "Invalid cipher algorithm"
msgstr "Ogiltig chifferalgoritm"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Nyckelring är öppnad"
#: src/err-codes.h:42
@@ -987,197 +991,952 @@ msgid "Bad octal character in S-expression"
msgstr "Felaktigt oktadecimalt tecken i S-uttryck"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Data är inte krypterat"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Okänt namn"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Ingen publik nyckel"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Buffert för liten"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Raden är för lång"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "Felaktig certifikatkedja"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Certifikatet är för ungt"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "Ogiltigt kort"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Oväntad tagg"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "Ogiltig chifferalgoritm"
+
+#: src/err-codes.h:260
+#, fuzzy
+msgid "Missing client certificate"
+msgstr "Saknar certifikat"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Certifikatet är spärrat"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "Nyckeln har gått ut"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "Felaktig publik nyckel"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Okänt paket"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "Felaktig certifikatkedja"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "Nyckeln har gått ut"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
#| msgid "Invalid object"
msgid "Invalid lock object"
msgstr "Ogiltigt objekt"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Allmänt IPC-fel"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "IPC-acceptanrop misslyckades"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "IPC-anslutningsanrop misslyckades"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Ogiltigt IPC-svar"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Ogiltigt värde skickat till IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Ofullständig rad skickad till IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Raden skickad till IPC är för lång"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Nästlade IPC-kommandon"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Inget datasvarsanrop i IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Inget datafrågeanrop i IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Inte en IPC-server"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Inte en IPC-klient"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Problem med att starta IPC-server"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "IPC-läsfel"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "IPC-skrivfel"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "För mycket data för IPC-lager"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Oväntat IPC-kommando"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Okänt IPC-kommando"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "IPC-syntaxfel"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "IPC-anropet har avbrutits"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Ingen inmatningskälla för IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Ingen utmatningskälla för IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "IPC-parameterfel"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Okänd IPC-fråga"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+msgid "Crypto engine too old"
+msgstr "Ogiltig krypteringsmotor"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Dubblettvärde"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Certifikatet är för ungt"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Tillhandahållet objekt är för kort"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Okänt namn"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Ogiltig åtgärdskod"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Okänt namn"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Okänt systemfel"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Ogiltig OID-sträng"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Ogiltigt S-uttryck"
+
+#: src/err-codes.h:324
+#, fuzzy
+msgid "Missing DNS query packet"
+msgstr "Saknar certifikat"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Dekryptering misslyckades"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Tidsgräns"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Allmänt IPC-fel"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Allmänt fel"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Allmänt fel"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Allmänt Assuan-fel"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Allmänt fel"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Allmänt Assuan-fel"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC-skrivfel"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Allmänt IPC-fel"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "IPC-anslutningsanrop misslyckades"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Allmänt fel"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Nollställning av kort krävs"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Elementet hittades inte"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Stöds inte"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Oväntat fel"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Åtgärden stöds inte"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Felaktigt certifikat"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Okänd utökning"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Tidsgräns"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "dirmngr-fel"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "dirmngr-fel"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC-läsfel"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Inte en IPC-server"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Lyckades"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Konfigurationsfel"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Protokollöverträdelse"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Okänd utökning"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Allmänt fel"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Nollställning av kort krävs"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Ogiltigt attribut"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Skyddet stöds inte"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Protokollöverträdelse"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Ogiltigt tillstånd"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Inget CMS-objekt"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "HÃ¥rdvaruproblem"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ogiltigt tillstånd"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Kodningsproblem"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Skyddet stöds inte"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Ogiltigt kort"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Saknar åtgärd"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Protokollöverträdelse"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Åtgärden är ännu inte färdig"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Åtgärden avbröts"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Raden är för lång"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Åtgärden avbröts"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Allmänt IPC-fel"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Resurser överansträngda"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Protokollöverträdelse"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Ogiltigt tillstånd"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Certifikatet stöds inte"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Nollställning av kort krävs"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Lyckades"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Fungerar inte"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Fungerar inte"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Inte en IPC-server"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Dekryptering misslyckades"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Användardefinierad felkod 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Användardefinierad felkod 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Användardefinierad felkod 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Användardefinierad felkod 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Användardefinierad felkod 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Användardefinierad felkod 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Användardefinierad felkod 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Användardefinierad felkod 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Användardefinierad felkod 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Användardefinierad felkod 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Användardefinierad felkod 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Användardefinierad felkod 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Användardefinierad felkod 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Användardefinierad felkod 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Användardefinierad felkod 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Användardefinierad felkod 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Systemfel utan felnummer"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Okänt systemfel"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Slut på fil"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Okänd felkod"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Användning: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: varning: kände inte igen %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Resurser överansträngda"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Ogiltig data"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Allmänt fel"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "dirmngr-fel"
diff --git a/po/uk.gmo b/po/uk.gmo
index 9bce210..55526d8 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 60d8517..4b879ac 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -2,13 +2,13 @@
# Copyright (C) 2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the libgpg-error package.
#
-# Yuri Chornoivan <yurchor@ukr.net>, 2012.
+# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2014, 2015.
msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.7\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
-"PO-Revision-Date: 2013-02-23 20:25+0100\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2015-07-12 16:21+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
"Language: uk\n"
@@ -83,26 +83,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Будь-Ñке джерело"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Визначене кориÑтувачем джерело 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Визначене кориÑтувачем джерело 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Визначене кориÑтувачем джерело 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Визначене кориÑтувачем джерело 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Ðевідоме джерело"
@@ -159,7 +163,7 @@ msgid "Invalid cipher algorithm"
msgstr "Ðекоректний алгоритм шифруваннÑ"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Ð’Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñховища ключів"
#: src/err-codes.h:42
@@ -419,8 +423,6 @@ msgid "No agent running"
msgstr "Ðгент не запущено"
#: src/err-codes.h:106
-#, fuzzy
-#| msgid "agent error"
msgid "Agent error"
msgstr "Помилка агента"
@@ -825,118 +827,84 @@ msgid "No PIN given"
msgstr "Ðе вказано пінкоду"
#: src/err-codes.h:207
-#, fuzzy
-#| msgid "Not locked"
msgid "Not enabled"
-msgstr "Ðе заблоковано"
+msgstr "Ðе увімкнено"
#: src/err-codes.h:208
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "No crypto engine"
-msgstr "Ðекоректний рушій шифруваннÑ"
+msgstr "Ðемає Ñ€ÑƒÑˆÑ–Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ"
#: src/err-codes.h:209
-#, fuzzy
-#| msgid "Missing value"
msgid "Missing key"
-msgstr "Ðе виÑтачає значеннÑ"
+msgstr "Пропущено ключ"
#: src/err-codes.h:210
-#, fuzzy
-#| msgid "No CMS object"
msgid "Too many objects"
-msgstr "Ðемає об’єкта CMS"
+msgstr "Забагато об’єктів"
#: src/err-codes.h:211
msgid "Limit reached"
-msgstr ""
+msgstr "ДоÑÑгнуто обмеженнÑ"
#: src/err-codes.h:212
-#, fuzzy
-#| msgid "Card not initialized"
msgid "Not initialized"
-msgstr "Картку не ініціалізовано"
+msgstr "Ðе ініціалізовано"
#: src/err-codes.h:213
-#, fuzzy
-#| msgid "Missing certificate"
msgid "Missing issuer certificate"
-msgstr "Ðе виÑтачає Ñертифіката"
+msgstr "Ðе виÑтачає Ñертифіката видавцÑ"
#: src/err-codes.h:214
msgid "No keyserver available"
-msgstr ""
+msgstr "Ðемає доÑтупних Ñерверів ключів"
#: src/err-codes.h:215
-#, fuzzy
-#| msgid "Invalid time"
msgid "Invalid elliptic curve"
-msgstr "Ðекоректний чаÑ"
+msgstr "Ðекоректна еліптична крива"
#: src/err-codes.h:216
-#, fuzzy
-#| msgid "Unknown source"
msgid "Unknown elliptic curve"
-msgstr "Ðевідоме джерело"
+msgstr "Ðевідома еліптична крива"
#: src/err-codes.h:217
-#, fuzzy
-#| msgid "Duplicated value"
msgid "Duplicated key"
-msgstr "Ð”ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ"
+msgstr "Ð”ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°"
#: src/err-codes.h:218
-#, fuzzy
-#| msgid "Ambiguous name"
msgid "Ambiguous result"
-msgstr "Ðеоднозначна назва"
+msgstr "Ðеоднозначний результат"
#: src/err-codes.h:219
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "No crypto context"
-msgstr "Ðекоректний рушій шифруваннÑ"
+msgstr "Ðемає контекÑту шифруваннÑ"
#: src/err-codes.h:220
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Wrong crypto context"
-msgstr "Ðекоректний рушій шифруваннÑ"
+msgstr "Помилковий контекÑÑ‚ шифруваннÑ"
#: src/err-codes.h:221
-#, fuzzy
-#| msgid "Invalid crypto engine"
msgid "Bad crypto context"
-msgstr "Ðекоректний рушій шифруваннÑ"
+msgstr "Ðекоректний контекÑÑ‚ шифруваннÑ"
#: src/err-codes.h:222
msgid "Conflict in the crypto context"
-msgstr ""
+msgstr "Конфлікт у контекÑÑ‚Ñ– шифруваннÑ"
#: src/err-codes.h:223
-#, fuzzy
-#| msgid "No public key"
msgid "Broken public key"
-msgstr "Ðемає відкритого ключа"
+msgstr "Пошкоджений відкритий ключ"
#: src/err-codes.h:224
-#, fuzzy
-#| msgid "No secret key"
msgid "Broken secret key"
-msgstr "Ðемає закритого ключа"
+msgstr "Пошкоджений закритий ключ"
#: src/err-codes.h:225
-#, fuzzy
-#| msgid "Invalid digest algorithm"
msgid "Invalid MAC algorithm"
-msgstr "Ðекоректний алгоритм контрольної Ñуми"
+msgstr "Ðекоректний алгоритм MAC"
#: src/err-codes.h:226
-#, fuzzy
-#| msgid "Operation cancelled"
msgid "Operation fully cancelled"
-msgstr "Дію ÑкаÑовано"
+msgstr "Дію повніÑÑ‚ÑŽ ÑкаÑовано"
#: src/err-codes.h:227
msgid "Operation not yet finished"
@@ -995,203 +963,832 @@ msgid "Odd hexadecimal numbers in S-expression"
msgstr "Дивні шіÑтнадцÑткові чиÑла у S-виразі"
#: src/err-codes.h:241
-#, fuzzy
-#| msgid "Bad octadecimal character in S-expression"
msgid "Bad octal character in S-expression"
msgstr "Помилковий віÑімковий Ñимвол у S-виразі"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
-#| msgid "Invalid object"
-msgid "Invalid lock object"
-msgstr "Ðекоректний об’єкт"
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Дані не зашифровано"
#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Ðевідома назва"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Ðемає відкритого ключа"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr "ЗаÑтарілий ключ"
+
+#: src/err-codes.h:248
+msgid "Request too short"
+msgstr "Занадто короткий запит"
+
+#: src/err-codes.h:249
+msgid "Request too long"
+msgstr "Ðадто довгий запит"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr "Об’єкт перебуває у Ñтані перериваннÑ"
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "Ðемає ланцюжка Ñертифікації"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "Сертифікат є надто великим"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "Ðекоректний запиÑ"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "MAC не пройшов перевірку"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "Ðеочікуване повідомленнÑ"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "Помилка під Ñ‡Ð°Ñ ÑтиÑÐºÐ°Ð½Ð½Ñ Ð°Ð±Ð¾ видобуваннÑ"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "Відлік буде автоматично розпочато з початку"
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "Отримано критичне попереджувальне повідомленнÑ"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "Ðемає алгоритму шифруваннÑ"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "Ðе виÑтачає Ñертифіката клієнта"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "Отримано ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ закриттÑ"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "Строк дії квитка вичерпано"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "Помилковий квиток"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "Ðевідомий профіль"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ Ñертифікації під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+"Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ запиту Ñертифікації під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+"Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ перевірки Ñертифікації під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ "
+"зв’Ñзку"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ зміни шифру під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "Помилкове вітальне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "Помилкове вітальне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+"Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ñ–Ñ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ Ñервера під Ñ‡Ð°Ñ "
+"Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "Помилкове завершальне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™Ñзку"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+"Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ обміну ключами із Ñервером під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ "
+"зв’Ñзку"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+"Помилкове Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ обміну ключами із клієнтом під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ "
+"зв’Ñзку"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "Фіктивний Ñ€Ñдок"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr "Заборонено"
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "Ключ вимкнено"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "Ðеможливе Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð°, заÑнованого на картці"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "Ðекоректний об’єкт блокуваннÑ"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Загальна помилка IPC"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Помилка виклику прийнÑÑ‚Ñ‚Ñ IPC"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Помилка з’єднувального виклику IPC"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Ðекоректна відповідь IPC"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "IPC передано некоректне значеннÑ"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "IPC передано незавершений Ñ€Ñдок"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "РÑдок, переданий IPC, Ñ” надто довгим"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Вкладені команди IPC"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Ðемає зворотного виклику щодо даних у IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Ðемає інформаційного зворотного виклику у IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Ðе Ñ” Ñервером IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Ðе Ñ” клієнтом IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Проблеми із запуÑком Ñервера IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "Помилка запиÑу IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Забагато даних Ð´Ð»Ñ ÑˆÐ°Ñ€Ñƒ IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Ðеочікувана команда IPC"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Ðевідома команда IPC"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "СинтакÑична помилка IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "Виклик IPC було ÑкаÑовано"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Ðемає джерела вхідних даних Ð´Ð»Ñ IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Ðемає міÑÑ†Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ð´Ð»Ñ IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Помилка у параметрі IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Ðевідомий запит IPC"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "Ðемає Ñ€ÑƒÑˆÑ–Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "User ID already exists"
+msgstr "Вже Ñ–Ñнує (LDAP)"
+
+#: src/err-codes.h:311
+#, fuzzy
+#| msgid "Already exists (LDAP)"
+msgid "Name already exists"
+msgstr "Вже Ñ–Ñнує (LDAP)"
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Ð”ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Сертифікат є надто новим"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Ðаданий об’єкт Ñ” надто коротким"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Ðевідома назва"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Ðекоректний код дії"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Ðевідома назва"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Ðевідома ÑиÑтемна помилка"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Ðекоректний Ñ€Ñдок OID"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Ðекоректний S-вираз"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "Ðе виÑтачає Ñертифіката видавцÑ"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Спроба Ñ€Ð¾Ð·ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð·Ð½Ð°Ð»Ð° невдачі"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ"
+
+#: src/err-codes.h:329
+msgid "General LDAP error"
+msgstr "Загальна помилка LDAP"
+
+#: src/err-codes.h:330
+msgid "General LDAP attribute error"
+msgstr "Загальна помилка атрибута LDAP"
+
+#: src/err-codes.h:331
+msgid "General LDAP name error"
+msgstr "Загальна помилка назви LDAP"
+
+#: src/err-codes.h:332
+msgid "General LDAP security error"
+msgstr "Загальна помилка захиÑту LDAP"
+
+#: src/err-codes.h:333
+msgid "General LDAP service error"
+msgstr "Загальна помилка Ñлужби LDAP"
+
+#: src/err-codes.h:334
+msgid "General LDAP update error"
+msgstr "Загальна помилка Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ LDAP"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr "ЕкÑпериментальний код помилки LDAP"
+
+#: src/err-codes.h:336
+msgid "Private LDAP error code"
+msgstr "Код конфіденційної помилки LDAP"
+
+#: src/err-codes.h:337
+msgid "Other general LDAP error"
+msgstr "Інша загальна помилка LDAP"
+
+#: src/err-codes.h:338
+msgid "LDAP connecting failed (X)"
+msgstr "Ðе вдалоÑÑ Ð·â€™Ñ”Ð´Ð½Ð°Ñ‚Ð¸ÑÑ Ñ–Ð· LDAP (X)"
+
+#: src/err-codes.h:339
+msgid "LDAP referral limit exceeded"
+msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ щодо ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ LDAP"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr "Циклічний клієнт LDAP"
+
+#: src/err-codes.h:341
+msgid "No LDAP results returned"
+msgstr "Ðе повернуто результатів LDAP"
+
+#: src/err-codes.h:342
+msgid "LDAP control not found"
+msgstr "Ðе знайдено ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:343
+msgid "Not supported by LDAP"
+msgstr "Ðе підтримуєтьÑÑ LDAP"
+
+#: src/err-codes.h:344
+msgid "LDAP connect error"
+msgstr "Помилка Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr "Ðе виÑтачає пам’ÑÑ‚Ñ– у LDAP"
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr "Помилковий параметр підпрограми LDAP"
+
+#: src/err-codes.h:347
+msgid "User cancelled LDAP operation"
+msgstr "Дію LDAP ÑкаÑовано кориÑтувачем"
+
+#: src/err-codes.h:348
+msgid "Bad LDAP search filter"
+msgstr "Помилковий фільтр пошуку LDAP"
+
+#: src/err-codes.h:349
+msgid "Unknown LDAP authentication method"
+msgstr "Ðевідомий ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:350
+msgid "Timeout in LDAP"
+msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ LDAP"
+
+#: src/err-codes.h:351
+msgid "LDAP decoding error"
+msgstr "Помилка Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:352
+msgid "LDAP encoding error"
+msgstr "Помилка ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:353
+msgid "LDAP local error"
+msgstr "Локальна помилка LDAP"
+
+#: src/err-codes.h:354
+msgid "Cannot contact LDAP server"
+msgstr "Ðе вдалоÑÑ Ð²Ñтановити зв’Ñзок із Ñервером LDAP"
+
+#: src/err-codes.h:355
+msgid "LDAP success"
+msgstr "УÑпіх LDAP"
+
+#: src/err-codes.h:356
+msgid "LDAP operations error"
+msgstr "Помилка дій LDAP"
+
+#: src/err-codes.h:357
+msgid "LDAP protocol error"
+msgstr "Помилка протоколу LDAP"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr "Перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ LDAP"
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr "Перевищено Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір у LDAP"
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr "ПорівнÑÐ½Ð½Ñ LDAP: не збігаютьÑÑ"
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr "ПорівнÑÐ½Ð½Ñ LDAP: збігаютьÑÑ"
+
+#: src/err-codes.h:362
+msgid "LDAP authentication method not supported"
+msgstr "Підтримки методу Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ LDAP не передбачено"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr "Потрібен потужніший ÑпоÑіб Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr "Отримано чаÑткові результати Ñ– ÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:365
+msgid "LDAP referral"
+msgstr "СпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr "Перевищено адмініÑтративне Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ LDAP"
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr "ÐедоÑтупне критичне Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ LDAP"
+
+#: src/err-codes.h:368
+msgid "Confidentiality required by LDAP"
+msgstr "Конфіденційно потрібне LDAP"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr "Виконуємо прив’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ SASL LDAP"
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr "Ðемає такого атрибута LDAP"
+
+#: src/err-codes.h:371
+msgid "Undefined LDAP attribute type"
+msgstr "Ðевизначний тип атрибута LDAP"
+
+#: src/err-codes.h:372
+msgid "Inappropriate matching in LDAP"
+msgstr "ÐеприйнÑтна відповідніÑÑ‚ÑŒ у LDAP"
+
+#: src/err-codes.h:373
+msgid "Constraint violation in LDAP"
+msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ у LDAP"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr "Тип або Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDAP Ñ–Ñнує"
+
+#: src/err-codes.h:375
+msgid "Invalid syntax in LDAP"
+msgstr "Ðекоректний ÑинтакÑÐ¸Ñ Ñƒ LDAP"
+
+#: src/err-codes.h:376
+msgid "No such LDAP object"
+msgstr "Ðемає такого об’єкта LDAP"
+
+#: src/err-codes.h:377
+msgid "LDAP alias problem"
+msgstr "Проблема пÑевдоніма LDAP"
+
+#: src/err-codes.h:378
+msgid "Invalid DN syntax in LDAP"
+msgstr "Ðекоректний ÑинтакÑÐ¸Ñ DN у LDAP"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr "Ð—Ð°Ð¿Ð¸Ñ LDAP Ñ” лиÑтком"
+
+#: src/err-codes.h:380
+msgid "LDAP alias dereferencing problem"
+msgstr "Проблемі з ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²â€™Ñзки пÑевдоніма LDAP"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr "Помилка ÑƒÐ¿Ð¾Ð²Ð½Ð¾Ð²Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– LDAP (X)"
+
+#: src/err-codes.h:382
+msgid "Inappropriate LDAP authentication"
+msgstr "ÐеприйнÑтне Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:383
+msgid "Invalid LDAP credentials"
+msgstr "Ðекоректні реєÑтраційні дані LDAP"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr "ÐедоÑтатні права доÑтупу до LDAP"
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr "Сервер LDAP зайнÑто виконаннÑм завданнÑ"
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr "Сервер LDAP недоÑтупний"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr "Сервер LDAP не бажає працювати"
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr "LDAP виÑвлено цикл"
+
+#: src/err-codes.h:389
+msgid "LDAP naming violation"
+msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ñ–Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:390
+msgid "LDAP object class violation"
+msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñу об’єктів LDAP"
+
+#: src/err-codes.h:391
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Дію LDAP не дозволено Ð´Ð»Ñ Ð¾Ð±â€™Ñ”ÐºÑ‚Ñ–Ð², Ñкі не Ñ” лиÑтками"
+
+#: src/err-codes.h:392
+msgid "LDAP operation not allowed on RDN"
+msgstr "Дію LDAP не дозволено над RDN"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr "Вже Ñ–Ñнує (LDAP)"
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ ÐºÐ»Ð°Ñ Ð¾Ð±â€™Ñ”ÐºÑ‚Ð° LDAP"
+
+#: src/err-codes.h:395
+msgid "LDAP results too large"
+msgstr "Результати LDAP є надто великими"
+
+#: src/err-codes.h:396
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Ð”Ñ–Ñ LDAP ÑтоÑуєтьÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… DSA"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr "Помилка переглÑду ÑпиÑку віртуальної LDAP"
+
+#: src/err-codes.h:398
+msgid "Other LDAP error"
+msgstr "Інша помилка LDAP"
+
+#: src/err-codes.h:399
+msgid "Resources exhausted in LCUP"
+msgstr "Вичерпано реÑурÑи у LCUP"
+
+#: src/err-codes.h:400
+msgid "Security violation in LCUP"
+msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту у LCUP"
+
+#: src/err-codes.h:401
+msgid "Invalid data in LCUP"
+msgstr "Ðекоректні дані у LCUP"
+
+#: src/err-codes.h:402
+msgid "Unsupported scheme in LCUP"
+msgstr "Ðепідтримувана Ñхема у LCUP"
+
+#: src/err-codes.h:403
+msgid "Reload required in LCUP"
+msgstr "Потрібне Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ LCUP"
+
+#: src/err-codes.h:404
+msgid "LDAP cancelled"
+msgstr "LDAP ÑкаÑовано"
+
+#: src/err-codes.h:405
+msgid "No LDAP operation to cancel"
+msgstr "Ðемає дії LDAP Ð´Ð»Ñ ÑкаÑовуваннÑ"
+
+#: src/err-codes.h:406
+msgid "Too late to cancel LDAP"
+msgstr "Запізно Ð´Ð»Ñ ÑкаÑÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ LDAP"
+
+#: src/err-codes.h:407
+msgid "Cannot cancel LDAP"
+msgstr "Ðе вдалоÑÑ ÑкаÑувати LDAP"
+
+#: src/err-codes.h:408
+msgid "LDAP assertion failed"
+msgstr "Помилка оцінки LDAP"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr "Ð£Ð¿Ð¾Ð²Ð½Ð¾Ð²Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою прокÑÑ– заборонено LDAP"
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Визначений кориÑтувачем код помилки 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Визначений кориÑтувачем код помилки 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Визначений кориÑтувачем код помилки 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Визначений кориÑтувачем код помилки 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Визначений кориÑтувачем код помилки 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Визначений кориÑтувачем код помилки 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Визначений кориÑтувачем код помилки 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Визначений кориÑтувачем код помилки 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Визначений кориÑтувачем код помилки 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Визначений кориÑтувачем код помилки 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Визначений кориÑтувачем код помилки 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Визначений кориÑтувачем код помилки 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Визначений кориÑтувачем код помилки 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Визначений кориÑтувачем код помилки 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Визначений кориÑтувачем код помилки 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Визначений кориÑтувачем код помилки 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "СиÑтемна помилка без номера"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Ðевідома ÑиÑтемна помилка"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Кінець файла"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Помилка з невідомим кодом"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "КориÑтуваннÑ: %s ПОМИЛКÐ-GPG [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: попередженнÑ: не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Вичерпано реÑурÑи"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Ðекоректні дані"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Загальна помилка"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "Помилка dirmngr"
diff --git a/po/vi.gmo b/po/vi.gmo
index 9099667..f5976ca 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index 9ca6797..69da804 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.7\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: 2013-02-23 20:10+0100\n"
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
@@ -83,26 +83,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "Bất cứ nguồn nào"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "Nguồn tự xác định 1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "Nguồn tự xác định 2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "Nguồn tự xác định 3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "Nguồn tự xác định 4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "Nguồn không rõ"
@@ -159,7 +163,7 @@ msgid "Invalid cipher algorithm"
msgstr "Thuật toán mật mã không hợp lệ"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr "Vòng khoá đã mở"
#: src/err-codes.h:42
@@ -989,197 +993,952 @@ msgid "Bad octal character in S-expression"
msgstr "Ký tự bát phân sai trong biểu thức S"
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "Chưa mật mã dữ liệu"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "Tên không rõ"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "Không có khoá công"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "Vùng đệm quá ngắn"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "Dòng quá dài"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "Dây chứng nhận sai"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "Chứng nhận quá mới"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "Thẻ không hợp lệ"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected tag"
+msgid "Unexpected message"
+msgstr "Thẻ (tag) bất thÆ°á»ng"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "Thuật toán mật mã không hợp lệ"
+
+#: src/err-codes.h:260
+#, fuzzy
+msgid "Missing client certificate"
+msgstr "Chứng nhận còn thiếu"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "Chứng nhận bị thu hồi"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "Khoá hết hạn"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "Khoá công sai"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "Gói tin không rõ"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "Dây chứng nhận sai"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "Khoá hết hạn"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
#| msgid "Invalid object"
msgid "Invalid lock object"
msgstr "Äối tượng không hợp lệ"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "Lá»—i IPC chung"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr "Lá»i gá»i chấp nhận IPC bị lá»—i"
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr "Lá»i gá»i kết nối IPC bị lá»—i"
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr "Äáp ứng IPC không hợp lệ"
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr "Giá trị không hợp lệ được gửi cho IPC"
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr "Dòng không hoàn toàn được gửi cho IPC"
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr "Dòng quá dài được gửi cho IPC"
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr "Các câu lệnh IPC lồng nhau"
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr "Không có lá»i gá»i ngược lại dữ liệu trong IPC"
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr "Không có lá»i gá»i ngược lại yêu cầu trong IPC"
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "Không phải trình phục vụ IPC"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "Không phải ứng dụng khách IPC"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr "Gặp khó khăn trong việc khởi chạy trình phục vụ IPC"
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "Lá»—i Ä‘á»c IPC"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "Lá»—i ghi IPC"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr "Quá nhiá»u dữ liệu cho lá»›p IPC"
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr "Câu lệnh IPC bất thÆ°á»ng"
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "Câu lệnh IPC không rõ"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "Lỗi cú pháp IPC"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr "Lá»i gá»i IPC bị thôi"
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr "Không có nguồn nhập vào cho IPC"
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr "Không có nguồn kết xuất cho IPC"
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "Lỗi tham số IPC"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr "Yêu cầu IPC không rõ"
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+msgid "Crypto engine too old"
+msgstr "Cơ chế mật mã không hợp lệ"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "Giá trị trùng"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "Chứng nhận quá mới"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "Äã cung cấp má»™t đối tượng quá ngắn"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "Tên không rõ"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "Mã thao tác không hợp lệ"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "Tên không rõ"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "Gặp lỗi hệ thống không rõ"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "Chuỗi OID không hợp lệ"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "Biểu thức S không hợp lệ"
+
+#: src/err-codes.h:324
+#, fuzzy
+msgid "Missing DNS query packet"
+msgstr "Chứng nhận còn thiếu"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "Lỗi giải mật mã"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "Quá giá»"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "Lá»—i IPC chung"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "Lá»—i chung"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "Lá»—i chung"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "Lá»—i Assuan chung"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "Lá»—i chung"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "Lá»—i Assuan chung"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "Lá»—i ghi IPC"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "Lá»—i IPC chung"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "Lá»i gá»i kết nối IPC bị lá»—i"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "Lá»—i chung"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "Cần thiết lập lại thẻ"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "Không tìm thấy phần tử"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "Không được hỗ trợ"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "Gặp lá»—i bất thÆ°á»ng"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "Thao tác không được hỗ trợ"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "Chứng nhận sai"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "Phần mở rộng không rõ"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "Quá giá»"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "Lá»—i dirmngr"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "Lá»—i dirmngr"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "Lá»—i Ä‘á»c IPC"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "Không phải trình phục vụ IPC"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "Thành công"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "Lỗi cấu hình"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "Vi phạm giao thức"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "Phần mở rộng không rõ"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "Lá»—i chung"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "Cần thiết lập lại thẻ"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "Thuộc tính không hợp lệ"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "Sự bảo vệ không được hỗ trợ"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "Vi phạm giao thức"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "Tình trạng không hợp lệ"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "Không có đối tượng CMS"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "Lỗi phần cứng"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "Tình trạng không hợp lệ"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "Lỗi mã hoá"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "Sự bảo vệ không được hỗ trợ"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "Thẻ không hợp lệ"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "Thiếu hành động"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "Vi phạm giao thức"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "Thao tác chưa kết thúc"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "Thao tác bị hủy bá»"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "Dòng quá dài"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "Thao tác bị hủy bá»"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "Lá»—i IPC chung"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "Cạn tài nguyên"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "Vi phạm giao thức"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "Tình trạng không hợp lệ"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "Chứng nhận không được hỗ trợ"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "Cần thiết lập lại thẻ"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "Thành công"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "Không hoạt động được"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "Không hoạt động được"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "Không phải trình phục vụ IPC"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "Lỗi giải mật mã"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "Mã lỗi tự xác định 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "Mã lỗi tự xác định 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "Mã lỗi tự xác định 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "Mã lỗi tự xác định 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "Mã lỗi tự xác định 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "Mã lỗi tự xác định 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "Mã lỗi tự xác định 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "Mã lỗi tự xác định 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "Mã lỗi tự xác định 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "Mã lỗi tự xác định 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "Mã lỗi tự xác định 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "Mã lỗi tự xác định 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "Mã lỗi tự xác định 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "Mã lỗi tự xác định 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "Mã lỗi tự xác định 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "Mã lỗi tự xác định 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr "Lỗi hệ thống không có số thứ tự lỗi"
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "Gặp lỗi hệ thống không rõ"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "Kết thúc tập tin"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "Mã lỗi không rõ"
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr "Sử dụng: %s GPG-ERROR [...]\n"
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s: cảnh báo : không thể nhận ra %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "Cạn tài nguyên"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "Dữ liệu không hợp lệ"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "Lá»—i chung"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "Lá»—i dirmngr"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index e5f830c..fb6b1bb 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 1093e7f..af5ca56 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libgpg-error 1.7\n"
"Report-Msgid-Bugs-To: translations@gnupg.org\n"
-"POT-Creation-Date: 2014-04-15 14:26+0200\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
"PO-Revision-Date: 2013-02-23 20:11+0100\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists."
@@ -83,26 +83,30 @@ msgid "Assuan"
msgstr "Assuan"
#: src/err-sources.h:44
+msgid "TLS"
+msgstr ""
+
+#: src/err-sources.h:45
msgid "Any source"
msgstr "任何æ¥æº"
-#: src/err-sources.h:45
+#: src/err-sources.h:46
msgid "User defined source 1"
msgstr "用户定义的æ¥æº1"
-#: src/err-sources.h:46
+#: src/err-sources.h:47
msgid "User defined source 2"
msgstr "用户定义的æ¥æº2"
-#: src/err-sources.h:47
+#: src/err-sources.h:48
msgid "User defined source 3"
msgstr "用户定义的æ¥æº3"
-#: src/err-sources.h:48
+#: src/err-sources.h:49
msgid "User defined source 4"
msgstr "用户定义的æ¥æº4"
-#: src/err-sources.h:49
+#: src/err-sources.h:50
msgid "Unknown source"
msgstr "æ¥æºä¸æ˜Ž"
@@ -159,7 +163,7 @@ msgid "Invalid cipher algorithm"
msgstr "无效的密ç ç®—法"
#: src/err-codes.h:41
-msgid "Keyring open"
+msgid "Cannot open keyring"
msgstr ""
#: src/err-codes.h:42
@@ -986,197 +990,950 @@ msgid "Bad octal character in S-expression"
msgstr ""
#: src/err-codes.h:242
-msgid "Not possible with a card based key"
+msgid "All subkeys are expired or revoked"
msgstr ""
#: src/err-codes.h:243
#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "æ•°æ®æœªåŠ å¯†"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "未知å称"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "没有公钥"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "缓冲区太短"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "线太长"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "No certificate chain"
+msgstr "æŸåçš„è¯ä¹¦é“¾"
+
+#: src/err-codes.h:252
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Certificate is too large"
+msgstr "è¯ä¹¦å¤ªæ–°"
+
+#: src/err-codes.h:253
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid record"
+msgstr "无效的å¡"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr ""
+
+#: src/err-codes.h:255
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "Unexpected message"
+msgstr "æ„外错误"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr ""
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr ""
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr ""
+
+#: src/err-codes.h:259
+#, fuzzy
+#| msgid "Invalid cipher algorithm"
+msgid "No cipher algorithm"
+msgstr "无效的密ç ç®—法"
+
+#: src/err-codes.h:260
+#, fuzzy
+msgid "Missing client certificate"
+msgstr "缺失è¯ä¹¦"
+
+#: src/err-codes.h:261
+#, fuzzy
+#| msgid "Certificate revoked"
+msgid "Close notification received"
+msgstr "è¯ä¹¦å·²åŠé”€"
+
+#: src/err-codes.h:262
+#, fuzzy
+#| msgid "Key expired"
+msgid "Ticket expired"
+msgstr "密钥已过期"
+
+#: src/err-codes.h:263
+#, fuzzy
+#| msgid "Bad public key"
+msgid "Bad ticket"
+msgstr "æŸå的公钥"
+
+#: src/err-codes.h:264
+#, fuzzy
+#| msgid "Unknown packet"
+msgid "Unknown identity"
+msgstr "未知的包"
+
+#: src/err-codes.h:265
+#, fuzzy
+#| msgid "Bad certificate chain"
+msgid "Bad certificate message in handshake"
+msgstr "æŸåçš„è¯ä¹¦é“¾"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr ""
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr ""
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr ""
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr ""
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr ""
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr ""
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr ""
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr ""
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+#, fuzzy
+#| msgid "Key expired"
+msgid "Key disabled"
+msgstr "密钥已过期"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr ""
+
+#: src/err-codes.h:279
+#, fuzzy
#| msgid "Invalid object"
msgid "Invalid lock object"
msgstr "无效的对象"
-#: src/err-codes.h:244
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
msgid "General IPC error"
msgstr "一般IPC 错误"
-#: src/err-codes.h:245
+#: src/err-codes.h:283
msgid "IPC accept call failed"
msgstr ""
-#: src/err-codes.h:246
+#: src/err-codes.h:284
msgid "IPC connect call failed"
msgstr ""
-#: src/err-codes.h:247
+#: src/err-codes.h:285
msgid "Invalid IPC response"
msgstr ""
-#: src/err-codes.h:248
+#: src/err-codes.h:286
msgid "Invalid value passed to IPC"
msgstr ""
-#: src/err-codes.h:249
+#: src/err-codes.h:287
msgid "Incomplete line passed to IPC"
msgstr ""
-#: src/err-codes.h:250
+#: src/err-codes.h:288
msgid "Line passed to IPC too long"
msgstr ""
-#: src/err-codes.h:251
+#: src/err-codes.h:289
msgid "Nested IPC commands"
msgstr ""
-#: src/err-codes.h:252
+#: src/err-codes.h:290
msgid "No data callback in IPC"
msgstr ""
-#: src/err-codes.h:253
+#: src/err-codes.h:291
msgid "No inquire callback in IPC"
msgstr ""
-#: src/err-codes.h:254
+#: src/err-codes.h:292
msgid "Not an IPC server"
msgstr "ä¸æ˜¯IPC æœåŠ¡å™¨"
-#: src/err-codes.h:255
+#: src/err-codes.h:293
msgid "Not an IPC client"
msgstr "ä¸æ˜¯IPC 客户端"
-#: src/err-codes.h:256
+#: src/err-codes.h:294
msgid "Problem starting IPC server"
msgstr ""
-#: src/err-codes.h:257
+#: src/err-codes.h:295
msgid "IPC read error"
msgstr "IPC 读å–错误"
-#: src/err-codes.h:258
+#: src/err-codes.h:296
msgid "IPC write error"
msgstr "IPC写入 错误"
-#: src/err-codes.h:259
+#: src/err-codes.h:297
msgid "Too much data for IPC layer"
msgstr ""
-#: src/err-codes.h:260
+#: src/err-codes.h:298
msgid "Unexpected IPC command"
msgstr ""
-#: src/err-codes.h:261
+#: src/err-codes.h:299
msgid "Unknown IPC command"
msgstr "未知IPC 命令"
-#: src/err-codes.h:262
+#: src/err-codes.h:300
msgid "IPC syntax error"
msgstr "IPC 语法错误"
-#: src/err-codes.h:263
+#: src/err-codes.h:301
msgid "IPC call has been cancelled"
msgstr ""
-#: src/err-codes.h:264
+#: src/err-codes.h:302
msgid "No input source for IPC"
msgstr ""
-#: src/err-codes.h:265
+#: src/err-codes.h:303
msgid "No output source for IPC"
msgstr ""
-#: src/err-codes.h:266
+#: src/err-codes.h:304
msgid "IPC parameter error"
msgstr "IPC å‚数错误"
-#: src/err-codes.h:267
+#: src/err-codes.h:305
msgid "Unknown IPC inquire"
msgstr ""
-#: src/err-codes.h:268
+#: src/err-codes.h:306
+#, fuzzy
+msgid "Crypto engine too old"
+msgstr "无效的加密引擎"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "é‡å¤å€¼"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "è¯ä¹¦å¤ªæ–°"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "æ供对象太短"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "未知å称"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "无效的æ“作ç "
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "未知å称"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "未知的系统错误"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "无效的OID 字符串"
+
+#: src/err-codes.h:323
+msgid "Invalid textual address form"
+msgstr ""
+
+#: src/err-codes.h:324
+#, fuzzy
+msgid "Missing DNS query packet"
+msgstr "缺失è¯ä¹¦"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "解密失败"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "超时"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "一般IPC 错误"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "一般错误"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "一般错误"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "一般Assuan 错误"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "一般错误"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "一般Assuan 错误"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC写入 错误"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "一般IPC 错误"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP connecting failed (X)"
+msgstr "解密失败"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "一般错误"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "è¦æ±‚é‡ç½®å¡"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "未找到元素"
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "ä¸æ”¯æŒ"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "æ„外错误"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "ä¸æ”¯æŒçš„æ“作"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "æŸåçš„è¯ä¹¦"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "未知的扩展å"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "超时"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "agent error"
+msgid "LDAP decoding error"
+msgstr "代ç†é”™è¯¯"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "agent error"
+msgid "LDAP encoding error"
+msgstr "代ç†é”™è¯¯"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC 读å–错误"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "ä¸æ˜¯IPC æœåŠ¡å™¨"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "æˆåŠŸ"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "é…置错误"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "è¿ååè®®"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "未知的扩展å"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+msgid "Partial LDAP results+referral received"
+msgstr ""
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "一般错误"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "è¦æ±‚é‡ç½®å¡"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "无效的属性"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "ä¸å—支æŒçš„ä¿æŠ¤"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "è¿ååè®®"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "无效的州"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "没有CMS 对象"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "硬件问题"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "无效的州"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "ç¼–ç é—®é¢˜"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "ä¸å—支æŒçš„ä¿æŠ¤"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "无效的å¡"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+msgid "LDAP server is unavailable"
+msgstr ""
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP naming violation"
+msgstr "è¿ååè®®"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "è¿ååè®®"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "æ“作尚未完æˆ"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "线太长"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "一般IPC 错误"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "内存耗尽"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "è¿ååè®®"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "无效的州"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "ä¸æ”¯æŒçš„凭è¯"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "è¦æ±‚é‡ç½®å¡"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "æˆåŠŸ"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "No LDAP operation to cancel"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "Too late to cancel LDAP"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "ä¸æ˜¯IPC æœåŠ¡å™¨"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "解密失败"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
msgid "User defined error code 1"
msgstr "用户定义的错误代ç 1"
-#: src/err-codes.h:269
+#: src/err-codes.h:411
msgid "User defined error code 2"
msgstr "用户定义的错误代ç 2"
-#: src/err-codes.h:270
+#: src/err-codes.h:412
msgid "User defined error code 3"
msgstr "用户定义的错误代ç 3"
-#: src/err-codes.h:271
+#: src/err-codes.h:413
msgid "User defined error code 4"
msgstr "用户定义的错误代ç 4"
-#: src/err-codes.h:272
+#: src/err-codes.h:414
msgid "User defined error code 5"
msgstr "用户定义的错误代ç 5"
-#: src/err-codes.h:273
+#: src/err-codes.h:415
msgid "User defined error code 6"
msgstr "用户定义的错误代ç 6"
-#: src/err-codes.h:274
+#: src/err-codes.h:416
msgid "User defined error code 7"
msgstr "用户定义的错误代ç 7"
-#: src/err-codes.h:275
+#: src/err-codes.h:417
msgid "User defined error code 8"
msgstr "用户定义的错误代ç 8"
-#: src/err-codes.h:276
+#: src/err-codes.h:418
msgid "User defined error code 9"
msgstr "用户定义的错误ç 9"
-#: src/err-codes.h:277
+#: src/err-codes.h:419
msgid "User defined error code 10"
msgstr "用户定义的错误代ç 10"
-#: src/err-codes.h:278
+#: src/err-codes.h:420
msgid "User defined error code 11"
msgstr "用户定义的错误代ç 11"
-#: src/err-codes.h:279
+#: src/err-codes.h:421
msgid "User defined error code 12"
msgstr "用户定义的错误代ç 12"
-#: src/err-codes.h:280
+#: src/err-codes.h:422
msgid "User defined error code 13"
msgstr "用户定义的错误代ç 13"
-#: src/err-codes.h:281
+#: src/err-codes.h:423
msgid "User defined error code 14"
msgstr "用户定义的错误代ç 14"
-#: src/err-codes.h:282
+#: src/err-codes.h:424
msgid "User defined error code 15"
msgstr "用户定义的错误代ç 15"
-#: src/err-codes.h:283
+#: src/err-codes.h:425
msgid "User defined error code 16"
msgstr "用户定义的错误代ç 16"
-#: src/err-codes.h:284
+#: src/err-codes.h:426
msgid "System error w/o errno"
msgstr ""
-#: src/err-codes.h:285
+#: src/err-codes.h:427
msgid "Unknown system error"
msgstr "未知的系统错误"
-#: src/err-codes.h:286
+#: src/err-codes.h:428
msgid "End of file"
msgstr "文件结尾"
-#: src/err-codes.h:287
+#: src/err-codes.h:429
msgid "Unknown error code"
msgstr "未知的错误代ç "
-#: src/gpg-error.c:392
+#: src/gpg-error.c:450
#, c-format
msgid "Usage: %s GPG-ERROR [...]\n"
msgstr ""
-#: src/gpg-error.c:448
+#: src/gpg-error.c:633
#, c-format
msgid "%s: warning: could not recognize %s\n"
msgstr "%s:警告:无法识别 %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "内存耗尽"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "无效的数æ®"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "一般错误"
+
+#, fuzzy
+#~| msgid "Encoding problem"
+#~ msgid "Encoding error"
+#~ msgstr "ç¼–ç é—®é¢˜"
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
new file mode 100644
index 0000000..4d664b4
--- /dev/null
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..cb57a95
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,1901 @@
+# zh_TW.po - Chinese traditional translations for libgpg-error
+# Copyright (C) 2014 Jedi Lin
+# This file is distributed under the same license as the libngpg-error package.
+# Jedi Lin <Jedi@Jedi.org>, 2014
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: libgpg-error 1.17\n"
+"Report-Msgid-Bugs-To: translations@gnupg.org\n"
+"POT-Creation-Date: 2017-02-28 15:06+0100\n"
+"PO-Revision-Date: 2014-11-17 21:25+0800\n"
+"Last-Translator: Jedi Lin <Jedi@Jedi.org>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-Basepath: libgpg-error-1.17\n"
+
+#: src/err-sources.h:28
+msgid "Unspecified source"
+msgstr "未指定的來æº"
+
+#: src/err-sources.h:29
+msgid "gcrypt"
+msgstr "gcrypt"
+
+#: src/err-sources.h:30
+msgid "GnuPG"
+msgstr "GnuPG"
+
+#: src/err-sources.h:31
+msgid "GpgSM"
+msgstr "GpgSM"
+
+#: src/err-sources.h:32
+msgid "GPG Agent"
+msgstr "GPG 代ç†"
+
+#: src/err-sources.h:33
+msgid "Pinentry"
+msgstr "個人識別碼項目"
+
+#: src/err-sources.h:34
+msgid "SCD"
+msgstr "SCD"
+
+#: src/err-sources.h:35
+msgid "GPGME"
+msgstr "GPGME"
+
+#: src/err-sources.h:36
+msgid "Keybox"
+msgstr "Keybox"
+
+#: src/err-sources.h:37
+msgid "KSBA"
+msgstr "KSBA"
+
+#: src/err-sources.h:38
+msgid "Dirmngr"
+msgstr "Dirmngr"
+
+#: src/err-sources.h:39
+msgid "GSTI"
+msgstr "GSTI"
+
+#: src/err-sources.h:40
+msgid "GPA"
+msgstr "GPA"
+
+#: src/err-sources.h:41
+msgid "Kleopatra"
+msgstr "Kleopatra"
+
+#: src/err-sources.h:42
+msgid "G13"
+msgstr "G13"
+
+#: src/err-sources.h:43
+msgid "Assuan"
+msgstr "Assuan"
+
+#: src/err-sources.h:44
+msgid "TLS"
+msgstr "TLS"
+
+#: src/err-sources.h:45
+msgid "Any source"
+msgstr "任何來æº"
+
+#: src/err-sources.h:46
+msgid "User defined source 1"
+msgstr "ä½¿ç”¨è€…å®šç¾©ä¾†æº 1"
+
+#: src/err-sources.h:47
+msgid "User defined source 2"
+msgstr "ä½¿ç”¨è€…å®šç¾©ä¾†æº 2"
+
+#: src/err-sources.h:48
+msgid "User defined source 3"
+msgstr "ä½¿ç”¨è€…å®šç¾©ä¾†æº 3"
+
+#: src/err-sources.h:49
+msgid "User defined source 4"
+msgstr "ä½¿ç”¨è€…å®šç¾©ä¾†æº 4"
+
+#: src/err-sources.h:50
+msgid "Unknown source"
+msgstr "未知的來æº"
+
+#: src/err-codes.h:28
+msgid "Success"
+msgstr "æˆåŠŸ"
+
+#: src/err-codes.h:29
+msgid "General error"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:30
+msgid "Unknown packet"
+msgstr "未知的å°åŒ…"
+
+#: src/err-codes.h:31
+msgid "Unknown version in packet"
+msgstr "å°åŒ…中的未知版本"
+
+#: src/err-codes.h:32
+msgid "Invalid public key algorithm"
+msgstr "無效的公鑰演算法"
+
+#: src/err-codes.h:33
+msgid "Invalid digest algorithm"
+msgstr "無效的摘è¦æ¼”算法"
+
+#: src/err-codes.h:34
+msgid "Bad public key"
+msgstr "ä¸è‰¯çš„公鑰"
+
+#: src/err-codes.h:35
+msgid "Bad secret key"
+msgstr "ä¸è‰¯çš„ç§é‘°"
+
+#: src/err-codes.h:36
+msgid "Bad signature"
+msgstr "ä¸è‰¯çš„簽章"
+
+#: src/err-codes.h:37
+msgid "No public key"
+msgstr "沒有公鑰"
+
+#: src/err-codes.h:38
+msgid "Checksum error"
+msgstr "檢核碼錯誤"
+
+#: src/err-codes.h:39
+msgid "Bad passphrase"
+msgstr "ä¸è‰¯çš„密語"
+
+#: src/err-codes.h:40
+msgid "Invalid cipher algorithm"
+msgstr "無效的編密演算法"
+
+#: src/err-codes.h:41
+msgid "Cannot open keyring"
+msgstr "金鑰éˆé–‹å•Ÿ"
+
+#: src/err-codes.h:42
+msgid "Invalid packet"
+msgstr "無效的å°åŒ…"
+
+#: src/err-codes.h:43
+msgid "Invalid armor"
+msgstr "無效的å°è£"
+
+#: src/err-codes.h:44
+msgid "No user ID"
+msgstr "沒有使用者 ID"
+
+#: src/err-codes.h:45
+msgid "No secret key"
+msgstr "沒有ç§é‘°"
+
+#: src/err-codes.h:46
+msgid "Wrong secret key used"
+msgstr "使用錯誤的ç§é‘°"
+
+#: src/err-codes.h:47
+msgid "Bad session key"
+msgstr "ä¸è‰¯çš„階段金鑰"
+
+#: src/err-codes.h:48
+msgid "Unknown compression algorithm"
+msgstr "未知的壓縮演算法"
+
+#: src/err-codes.h:49
+msgid "Number is not prime"
+msgstr "數值並éžè³ªæ•¸"
+
+#: src/err-codes.h:50
+msgid "Invalid encoding method"
+msgstr "無效的編碼方法"
+
+#: src/err-codes.h:51
+msgid "Invalid encryption scheme"
+msgstr "無效的加密框架"
+
+#: src/err-codes.h:52
+msgid "Invalid signature scheme"
+msgstr "無效的簽署框架"
+
+#: src/err-codes.h:53
+msgid "Invalid attribute"
+msgstr "無效的屬性"
+
+#: src/err-codes.h:54
+msgid "No value"
+msgstr "沒有值"
+
+#: src/err-codes.h:55
+msgid "Not found"
+msgstr "找ä¸åˆ°"
+
+#: src/err-codes.h:56
+msgid "Value not found"
+msgstr "找ä¸åˆ°å€¼"
+
+#: src/err-codes.h:57
+msgid "Syntax error"
+msgstr "語法錯誤"
+
+#: src/err-codes.h:58
+msgid "Bad MPI value"
+msgstr "ä¸è‰¯çš„ MPI 值"
+
+#: src/err-codes.h:59
+msgid "Invalid passphrase"
+msgstr "無效的密語"
+
+#: src/err-codes.h:60
+msgid "Invalid signature class"
+msgstr "無效的簽章類別"
+
+#: src/err-codes.h:61
+msgid "Resources exhausted"
+msgstr "資æºå·²è€—盡"
+
+#: src/err-codes.h:62
+msgid "Invalid keyring"
+msgstr "無效的鑰匙圈"
+
+#: src/err-codes.h:63
+msgid "Trust DB error"
+msgstr "信任資料庫錯誤"
+
+#: src/err-codes.h:64
+msgid "Bad certificate"
+msgstr "ä¸è‰¯çš„憑證"
+
+#: src/err-codes.h:65
+msgid "Invalid user ID"
+msgstr "無效的使用者 ID"
+
+#: src/err-codes.h:66
+msgid "Unexpected error"
+msgstr "未é æœŸçš„錯誤"
+
+#: src/err-codes.h:67
+msgid "Time conflict"
+msgstr "時間è¡çª"
+
+#: src/err-codes.h:68
+msgid "Keyserver error"
+msgstr "金鑰伺æœå™¨éŒ¯èª¤"
+
+#: src/err-codes.h:69
+msgid "Wrong public key algorithm"
+msgstr "錯誤的公鑰演算法"
+
+#: src/err-codes.h:70
+msgid "Tribute to D. A."
+msgstr "å‘ D. A. 致æ„"
+
+#: src/err-codes.h:71
+msgid "Weak encryption key"
+msgstr "弱加密金鑰"
+
+#: src/err-codes.h:72
+msgid "Invalid key length"
+msgstr "無效的金鑰長度"
+
+#: src/err-codes.h:73
+msgid "Invalid argument"
+msgstr "無效的引數"
+
+#: src/err-codes.h:74
+msgid "Syntax error in URI"
+msgstr "網å€ä¸­çš„語法錯誤"
+
+#: src/err-codes.h:75
+msgid "Invalid URI"
+msgstr "無效的網å€"
+
+#: src/err-codes.h:76
+msgid "Network error"
+msgstr "網路錯誤"
+
+#: src/err-codes.h:77
+msgid "Unknown host"
+msgstr "未知的主機"
+
+#: src/err-codes.h:78
+msgid "Selftest failed"
+msgstr "自我測試失敗"
+
+#: src/err-codes.h:79
+msgid "Data not encrypted"
+msgstr "資料未經加密"
+
+#: src/err-codes.h:80
+msgid "Data not processed"
+msgstr "資料未處ç†"
+
+#: src/err-codes.h:81
+msgid "Unusable public key"
+msgstr "無法使用的公鑰"
+
+#: src/err-codes.h:82
+msgid "Unusable secret key"
+msgstr "無法使用的ç§é‘°"
+
+#: src/err-codes.h:83
+msgid "Invalid value"
+msgstr "無效的值"
+
+#: src/err-codes.h:84
+msgid "Bad certificate chain"
+msgstr "ä¸è‰¯çš„憑證éˆ"
+
+#: src/err-codes.h:85
+msgid "Missing certificate"
+msgstr "éºå¤±æ†‘è­‰"
+
+#: src/err-codes.h:86
+msgid "No data"
+msgstr "沒有資料"
+
+#: src/err-codes.h:87
+msgid "Bug"
+msgstr "ç‘•ç–µ"
+
+#: src/err-codes.h:88
+msgid "Not supported"
+msgstr "未支æ´"
+
+#: src/err-codes.h:89
+msgid "Invalid operation code"
+msgstr "無效的æ“作碼"
+
+#: src/err-codes.h:90
+msgid "Timeout"
+msgstr "逾時"
+
+#: src/err-codes.h:91
+msgid "Internal error"
+msgstr "內部錯誤"
+
+#: src/err-codes.h:92
+msgid "EOF (gcrypt)"
+msgstr "EOF (gcrypt)"
+
+#: src/err-codes.h:93
+msgid "Invalid object"
+msgstr "無效的物件"
+
+#: src/err-codes.h:94
+msgid "Provided object is too short"
+msgstr "æ供的物件太短"
+
+#: src/err-codes.h:95
+msgid "Provided object is too large"
+msgstr "æ供的物件太大"
+
+#: src/err-codes.h:96
+msgid "Missing item in object"
+msgstr "物件中éºå¤±é …ç›®"
+
+#: src/err-codes.h:97
+msgid "Not implemented"
+msgstr "未實作"
+
+#: src/err-codes.h:98
+msgid "Conflicting use"
+msgstr "彼此è¡çªçš„用法"
+
+#: src/err-codes.h:99
+msgid "Invalid cipher mode"
+msgstr "無效的密碼法模å¼"
+
+#: src/err-codes.h:100
+msgid "Invalid flag"
+msgstr "無效的旗標"
+
+#: src/err-codes.h:101
+msgid "Invalid handle"
+msgstr "無效的代號"
+
+#: src/err-codes.h:102
+msgid "Result truncated"
+msgstr "çµæžœå·²æˆªå‰©éƒ¨åˆ†"
+
+#: src/err-codes.h:103
+msgid "Incomplete line"
+msgstr "ä¸å®Œæ•´åˆ—"
+
+#: src/err-codes.h:104
+msgid "Invalid response"
+msgstr "無效的回應"
+
+#: src/err-codes.h:105
+msgid "No agent running"
+msgstr "沒有執行中的代ç†ç¨‹å¼"
+
+#: src/err-codes.h:106
+msgid "Agent error"
+msgstr "代ç†ç¨‹å¼éŒ¯èª¤"
+
+#: src/err-codes.h:107
+msgid "Invalid data"
+msgstr "無效的資料"
+
+#: src/err-codes.h:108
+msgid "Unspecific Assuan server fault"
+msgstr "未指定的 Assuan 伺æœå™¨å‡ºéŒ¯"
+
+#: src/err-codes.h:109
+msgid "General Assuan error"
+msgstr "一般性的 Assuan 錯誤"
+
+#: src/err-codes.h:110
+msgid "Invalid session key"
+msgstr "無效的階段金鑰"
+
+#: src/err-codes.h:111
+msgid "Invalid S-expression"
+msgstr "無效的 S-表示å¼"
+
+#: src/err-codes.h:112
+msgid "Unsupported algorithm"
+msgstr "未支æ´çš„演算法"
+
+#: src/err-codes.h:113
+msgid "No pinentry"
+msgstr "沒有個人識別碼項目"
+
+#: src/err-codes.h:114
+msgid "pinentry error"
+msgstr "個人識別碼錯誤"
+
+#: src/err-codes.h:115
+msgid "Bad PIN"
+msgstr "ä¸è‰¯çš„個人識別碼"
+
+#: src/err-codes.h:116
+msgid "Invalid name"
+msgstr "無效的å稱"
+
+#: src/err-codes.h:117
+msgid "Bad data"
+msgstr "無效的資料"
+
+#: src/err-codes.h:118
+msgid "Invalid parameter"
+msgstr "無效的åƒæ•¸"
+
+#: src/err-codes.h:119
+msgid "Wrong card"
+msgstr "錯誤的å¡ç‰‡"
+
+#: src/err-codes.h:120
+msgid "No dirmngr"
+msgstr "沒有 dirmngr"
+
+#: src/err-codes.h:121
+msgid "dirmngr error"
+msgstr "dirmngr 錯誤"
+
+#: src/err-codes.h:122
+msgid "Certificate revoked"
+msgstr "憑證已撤銷"
+
+#: src/err-codes.h:123
+msgid "No CRL known"
+msgstr "沒有已知的 CRL"
+
+#: src/err-codes.h:124
+msgid "CRL too old"
+msgstr "CRL 太è€èˆŠ"
+
+#: src/err-codes.h:125
+msgid "Line too long"
+msgstr "列太長"
+
+#: src/err-codes.h:126
+msgid "Not trusted"
+msgstr "未信任"
+
+#: src/err-codes.h:127
+msgid "Operation cancelled"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:128
+msgid "Bad CA certificate"
+msgstr "ä¸è‰¯çš„ CA 憑證"
+
+#: src/err-codes.h:129
+msgid "Certificate expired"
+msgstr "憑證已逾期"
+
+#: src/err-codes.h:130
+msgid "Certificate too young"
+msgstr "憑證太年輕"
+
+#: src/err-codes.h:131
+msgid "Unsupported certificate"
+msgstr "未支æ´çš„憑證"
+
+#: src/err-codes.h:132
+msgid "Unknown S-expression"
+msgstr "未知的 S-表示å¼"
+
+#: src/err-codes.h:133
+msgid "Unsupported protection"
+msgstr "未支æ´çš„ä¿è­·"
+
+#: src/err-codes.h:134
+msgid "Corrupted protection"
+msgstr "æ毀的ä¿è­·"
+
+#: src/err-codes.h:135
+msgid "Ambiguous name"
+msgstr "模糊曖昧的å稱"
+
+#: src/err-codes.h:136
+msgid "Card error"
+msgstr "å¡ç‰‡éŒ¯èª¤"
+
+#: src/err-codes.h:137
+msgid "Card reset required"
+msgstr "å¡ç‰‡éœ€è¦é‡è¨­"
+
+#: src/err-codes.h:138
+msgid "Card removed"
+msgstr "å¡ç‰‡å·²ç§»é™¤"
+
+#: src/err-codes.h:139
+msgid "Invalid card"
+msgstr "無效的å¡ç‰‡"
+
+#: src/err-codes.h:140
+msgid "Card not present"
+msgstr "å¡ç‰‡ä¸å­˜åœ¨"
+
+#: src/err-codes.h:141
+msgid "No PKCS15 application"
+msgstr "沒有 PKCS15 應用程å¼"
+
+#: src/err-codes.h:142
+msgid "Not confirmed"
+msgstr "未確èª"
+
+#: src/err-codes.h:143
+msgid "Configuration error"
+msgstr "組態錯誤"
+
+#: src/err-codes.h:144
+msgid "No policy match"
+msgstr "沒有相符的政策"
+
+#: src/err-codes.h:145
+msgid "Invalid index"
+msgstr "無效的索引"
+
+#: src/err-codes.h:146
+msgid "Invalid ID"
+msgstr "無效的 ID"
+
+#: src/err-codes.h:147
+msgid "No SmartCard daemon"
+msgstr "沒有智慧å¡æœå‹™"
+
+#: src/err-codes.h:148
+msgid "SmartCard daemon error"
+msgstr "智慧å¡æœå‹™éŒ¯èª¤"
+
+#: src/err-codes.h:149
+msgid "Unsupported protocol"
+msgstr "未支æ´çš„å”定"
+
+#: src/err-codes.h:150
+msgid "Bad PIN method"
+msgstr "ä¸è‰¯çš„個人識別碼方法"
+
+#: src/err-codes.h:151
+msgid "Card not initialized"
+msgstr "å¡ç‰‡ç„¡æ³•åˆå§‹åŒ–"
+
+#: src/err-codes.h:152
+msgid "Unsupported operation"
+msgstr "未支æ´çš„æ“作"
+
+#: src/err-codes.h:153
+msgid "Wrong key usage"
+msgstr "錯誤的金鑰用法"
+
+#: src/err-codes.h:154
+msgid "Nothing found"
+msgstr "找ä¸åˆ°ä»»ä½•æ±è¥¿"
+
+#: src/err-codes.h:155
+msgid "Wrong blob type"
+msgstr "錯誤的二進ä½å¤§åž‹ç‰©ä»¶é¡žåž‹"
+
+#: src/err-codes.h:156
+msgid "Missing value"
+msgstr "éºå¤±å€¼"
+
+#: src/err-codes.h:157
+msgid "Hardware problem"
+msgstr "硬體å•é¡Œ"
+
+#: src/err-codes.h:158
+msgid "PIN blocked"
+msgstr "個人識別碼已擋掉"
+
+#: src/err-codes.h:159
+msgid "Conditions of use not satisfied"
+msgstr "使用æ¢ä»¶æœªæ»¿è¶³"
+
+#: src/err-codes.h:160
+msgid "PINs are not synced"
+msgstr "個人識別碼未åŒæ­¥"
+
+#: src/err-codes.h:161
+msgid "Invalid CRL"
+msgstr "無效的 CRL"
+
+#: src/err-codes.h:162
+msgid "BER error"
+msgstr "BER 錯誤"
+
+#: src/err-codes.h:163
+msgid "Invalid BER"
+msgstr "無效的 BER"
+
+#: src/err-codes.h:164
+msgid "Element not found"
+msgstr "找ä¸åˆ°å…ƒç´ "
+
+#: src/err-codes.h:165
+msgid "Identifier not found"
+msgstr "找ä¸åˆ°è­˜åˆ¥ç¬¦"
+
+#: src/err-codes.h:166
+msgid "Invalid tag"
+msgstr "無效的標籤"
+
+#: src/err-codes.h:167
+msgid "Invalid length"
+msgstr "無效的長度"
+
+#: src/err-codes.h:168
+msgid "Invalid key info"
+msgstr "無效的金鑰資訊"
+
+#: src/err-codes.h:169
+msgid "Unexpected tag"
+msgstr "未é æœŸçš„標籤"
+
+#: src/err-codes.h:170
+msgid "Not DER encoded"
+msgstr "未經 DER 編碼"
+
+#: src/err-codes.h:171
+msgid "No CMS object"
+msgstr "ä¸æ˜¯ CMS 物件"
+
+#: src/err-codes.h:172
+msgid "Invalid CMS object"
+msgstr "無效的 CMS 物件"
+
+#: src/err-codes.h:173
+msgid "Unknown CMS object"
+msgstr "未知的 CMS 物件"
+
+#: src/err-codes.h:174
+msgid "Unsupported CMS object"
+msgstr "未支æ´çš„ CMS 物件"
+
+#: src/err-codes.h:175
+msgid "Unsupported encoding"
+msgstr "未支æ´çš„編碼"
+
+#: src/err-codes.h:176
+msgid "Unsupported CMS version"
+msgstr "未支æ´çš„ CMS 版本"
+
+#: src/err-codes.h:177
+msgid "Unknown algorithm"
+msgstr "未知的演算法"
+
+#: src/err-codes.h:178
+msgid "Invalid crypto engine"
+msgstr "無效的密碼法引擎"
+
+#: src/err-codes.h:179
+msgid "Public key not trusted"
+msgstr "公鑰未信任"
+
+#: src/err-codes.h:180
+msgid "Decryption failed"
+msgstr "解密失敗"
+
+#: src/err-codes.h:181
+msgid "Key expired"
+msgstr "金鑰已逾期"
+
+#: src/err-codes.h:182
+msgid "Signature expired"
+msgstr "簽章已逾期"
+
+#: src/err-codes.h:183
+msgid "Encoding problem"
+msgstr "編碼å•é¡Œ"
+
+#: src/err-codes.h:184
+msgid "Invalid state"
+msgstr "無效的狀態"
+
+#: src/err-codes.h:185
+msgid "Duplicated value"
+msgstr "é‡è¤‡çš„值"
+
+#: src/err-codes.h:186
+msgid "Missing action"
+msgstr "éºå¤±è¡Œå‹•"
+
+#: src/err-codes.h:187
+msgid "ASN.1 module not found"
+msgstr "找ä¸åˆ° ASN.1 模組"
+
+#: src/err-codes.h:188
+msgid "Invalid OID string"
+msgstr "無效的 OID 字串"
+
+#: src/err-codes.h:189
+msgid "Invalid time"
+msgstr "無效的時間"
+
+#: src/err-codes.h:190
+msgid "Invalid CRL object"
+msgstr "無效的 CRL 物件"
+
+#: src/err-codes.h:191
+msgid "Unsupported CRL version"
+msgstr "未支æ´çš„ CRL 版本"
+
+#: src/err-codes.h:192
+msgid "Invalid certificate object"
+msgstr "無效的憑證物件"
+
+#: src/err-codes.h:193
+msgid "Unknown name"
+msgstr "無效的å稱"
+
+#: src/err-codes.h:194
+msgid "A locale function failed"
+msgstr "本地化函數功能失敗"
+
+#: src/err-codes.h:195
+msgid "Not locked"
+msgstr "未鎖定"
+
+#: src/err-codes.h:196
+msgid "Protocol violation"
+msgstr "未ä¾å”定進行"
+
+#: src/err-codes.h:197
+msgid "Invalid MAC"
+msgstr "無效的 MAC"
+
+#: src/err-codes.h:198
+msgid "Invalid request"
+msgstr "無效的請求"
+
+#: src/err-codes.h:199
+msgid "Unknown extension"
+msgstr "未知的擴充"
+
+#: src/err-codes.h:200
+msgid "Unknown critical extension"
+msgstr "未知的關éµæ“´å……"
+
+#: src/err-codes.h:201
+msgid "Locked"
+msgstr "已鎖定"
+
+#: src/err-codes.h:202
+msgid "Unknown option"
+msgstr "未知的é¸é …"
+
+#: src/err-codes.h:203
+msgid "Unknown command"
+msgstr "未知的指令"
+
+#: src/err-codes.h:204
+msgid "Not operational"
+msgstr "無法æ“作"
+
+#: src/err-codes.h:205
+msgid "No passphrase given"
+msgstr "沒有給定密語"
+
+#: src/err-codes.h:206
+msgid "No PIN given"
+msgstr "沒有給定個人識別碼"
+
+#: src/err-codes.h:207
+msgid "Not enabled"
+msgstr "未啟用"
+
+#: src/err-codes.h:208
+msgid "No crypto engine"
+msgstr "沒有密碼法引擎"
+
+#: src/err-codes.h:209
+msgid "Missing key"
+msgstr "éºå¤±é‡‘é‘°"
+
+#: src/err-codes.h:210
+msgid "Too many objects"
+msgstr "太多物件"
+
+#: src/err-codes.h:211
+msgid "Limit reached"
+msgstr "å·²é”極é™"
+
+#: src/err-codes.h:212
+msgid "Not initialized"
+msgstr "尚未åˆå§‹åŒ–"
+
+#: src/err-codes.h:213
+msgid "Missing issuer certificate"
+msgstr "éºå¤±ç™¼è¡Œè€…憑證"
+
+#: src/err-codes.h:214
+msgid "No keyserver available"
+msgstr "沒有å¯ç”¨çš„金鑰伺æœå™¨"
+
+#: src/err-codes.h:215
+msgid "Invalid elliptic curve"
+msgstr "無效的橢圓曲線"
+
+#: src/err-codes.h:216
+msgid "Unknown elliptic curve"
+msgstr "未知的橢圓曲線"
+
+#: src/err-codes.h:217
+msgid "Duplicated key"
+msgstr "é‡è¤‡çš„金鑰"
+
+#: src/err-codes.h:218
+msgid "Ambiguous result"
+msgstr "模糊曖昧的çµæžœ"
+
+#: src/err-codes.h:219
+msgid "No crypto context"
+msgstr "沒有密碼法脈絡"
+
+#: src/err-codes.h:220
+msgid "Wrong crypto context"
+msgstr "錯誤的密碼法脈絡"
+
+#: src/err-codes.h:221
+msgid "Bad crypto context"
+msgstr "ä¸è‰¯çš„密碼法脈絡"
+
+#: src/err-codes.h:222
+msgid "Conflict in the crypto context"
+msgstr "密碼法脈絡è¡çª"
+
+#: src/err-codes.h:223
+msgid "Broken public key"
+msgstr "æ毀的公鑰"
+
+#: src/err-codes.h:224
+msgid "Broken secret key"
+msgstr "æ毀的ç§é‘°"
+
+#: src/err-codes.h:225
+msgid "Invalid MAC algorithm"
+msgstr "無效的 MAC 演算法"
+
+#: src/err-codes.h:226
+msgid "Operation fully cancelled"
+msgstr "æ“作已完全å–消"
+
+#: src/err-codes.h:227
+msgid "Operation not yet finished"
+msgstr "æ“作尚未完æˆ"
+
+#: src/err-codes.h:228
+msgid "Buffer too short"
+msgstr "ç·©è¡å€å¤ªçŸ­"
+
+#: src/err-codes.h:229
+msgid "Invalid length specifier in S-expression"
+msgstr "S-表示å¼ä¸­çš„無效長度指定符"
+
+#: src/err-codes.h:230
+msgid "String too long in S-expression"
+msgstr "S-表示å¼ä¸­çš„字串太長"
+
+#: src/err-codes.h:231
+msgid "Unmatched parentheses in S-expression"
+msgstr "S-表示å¼ä¸­çš„括號未æˆå°"
+
+#: src/err-codes.h:232
+msgid "S-expression not canonical"
+msgstr "S-表示å¼ä¸¦éžæ¨™æº–åž‹"
+
+#: src/err-codes.h:233
+msgid "Bad character in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰ä¸è‰¯çš„字符"
+
+#: src/err-codes.h:234
+msgid "Bad quotation in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰ä¸è‰¯çš„引號"
+
+#: src/err-codes.h:235
+msgid "Zero prefix in S-expression"
+msgstr "S-表示å¼ä¸­é›¶å‰ç¶´"
+
+#: src/err-codes.h:236
+msgid "Nested display hints in S-expression"
+msgstr "S-表示å¼ä¸­å·¢ç‹€ä½¿ç”¨é¡¯ç¤ºæ示符號"
+
+#: src/err-codes.h:237
+msgid "Unmatched display hints"
+msgstr "未æˆå°çš„顯示æ示符號"
+
+#: src/err-codes.h:238
+msgid "Unexpected reserved punctuation in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰æœªé æœŸçš„ä¿ç•™ç¬¦è™Ÿ"
+
+#: src/err-codes.h:239
+msgid "Bad hexadecimal character in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰ä¸è‰¯çš„å六進制字符"
+
+#: src/err-codes.h:240
+msgid "Odd hexadecimal numbers in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰å¥‡æ€ªçš„å六進制數字"
+
+#: src/err-codes.h:241
+msgid "Bad octal character in S-expression"
+msgstr "S-表示å¼ä¸­æœ‰ä¸è‰¯çš„八進制字符"
+
+#: src/err-codes.h:242
+msgid "All subkeys are expired or revoked"
+msgstr ""
+
+#: src/err-codes.h:243
+#, fuzzy
+#| msgid "Data not encrypted"
+msgid "Database is corrupted"
+msgstr "資料未經加密"
+
+#: src/err-codes.h:244
+msgid "Server indicated a failure"
+msgstr ""
+
+#: src/err-codes.h:245
+#, fuzzy
+#| msgid "Unknown name"
+msgid "No name"
+msgstr "無效的å稱"
+
+#: src/err-codes.h:246
+#, fuzzy
+#| msgid "No public key"
+msgid "No key"
+msgstr "沒有公鑰"
+
+#: src/err-codes.h:247
+msgid "Legacy key"
+msgstr ""
+
+#: src/err-codes.h:248
+#, fuzzy
+#| msgid "Buffer too short"
+msgid "Request too short"
+msgstr "ç·©è¡å€å¤ªçŸ­"
+
+#: src/err-codes.h:249
+#, fuzzy
+#| msgid "Line too long"
+msgid "Request too long"
+msgstr "列太長"
+
+#: src/err-codes.h:250
+msgid "Object is in termination state"
+msgstr ""
+
+#: src/err-codes.h:251
+msgid "No certificate chain"
+msgstr "沒有憑證éˆ"
+
+#: src/err-codes.h:252
+msgid "Certificate is too large"
+msgstr "憑證太大"
+
+#: src/err-codes.h:253
+msgid "Invalid record"
+msgstr "無效的紀錄"
+
+#: src/err-codes.h:254
+msgid "The MAC does not verify"
+msgstr "MAC 未驗證"
+
+#: src/err-codes.h:255
+msgid "Unexpected message"
+msgstr "未é æœŸçš„訊æ¯"
+
+#: src/err-codes.h:256
+msgid "Compression or decompression failed"
+msgstr "壓縮或解壓縮失敗"
+
+#: src/err-codes.h:257
+msgid "A counter would wrap"
+msgstr "計數程å¼æœƒç–ŠåŠ "
+
+#: src/err-codes.h:258
+msgid "Fatal alert message received"
+msgstr "已收到嚴é‡è­¦å‘Šè¨Šæ¯"
+
+#: src/err-codes.h:259
+msgid "No cipher algorithm"
+msgstr "沒有密碼演算法"
+
+#: src/err-codes.h:260
+msgid "Missing client certificate"
+msgstr "éºå¤±ç”¨æˆ¶ç«¯æ†‘è­‰"
+
+#: src/err-codes.h:261
+msgid "Close notification received"
+msgstr "已收到關閉通知"
+
+#: src/err-codes.h:262
+msgid "Ticket expired"
+msgstr "進入權已逾期"
+
+#: src/err-codes.h:263
+msgid "Bad ticket"
+msgstr "ä¸è‰¯çš„進入權"
+
+#: src/err-codes.h:264
+msgid "Unknown identity"
+msgstr "未知的身分"
+
+#: src/err-codes.h:265
+msgid "Bad certificate message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯æ†‘證訊æ¯"
+
+#: src/err-codes.h:266
+msgid "Bad certificate request message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯æ†‘證請求訊æ¯"
+
+#: src/err-codes.h:267
+msgid "Bad certificate verify message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯æ†‘證驗證訊æ¯"
+
+#: src/err-codes.h:268
+msgid "Bad change cipher message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯è®Šæ›´å¯†ç¢¼æ³•è¨Šæ¯"
+
+#: src/err-codes.h:269
+msgid "Bad client hello message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯ç”¨æˆ¶ç«¯å•å€™è¨Šæ¯"
+
+#: src/err-codes.h:270
+msgid "Bad server hello message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯ä¼ºæœå™¨å•å€™è¨Šæ¯"
+
+#: src/err-codes.h:271
+msgid "Bad server hello done message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯ä¼ºæœå™¨å•å€™å®Œæˆè¨Šæ¯"
+
+#: src/err-codes.h:272
+msgid "Bad finished message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯å·²å®Œæˆè¨Šæ¯"
+
+#: src/err-codes.h:273
+msgid "Bad server key exchange message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯ä¼ºæœå™¨é‡‘鑰交æ›è¨Šæ¯"
+
+#: src/err-codes.h:274
+msgid "Bad client key exchange message in handshake"
+msgstr "交æ¡ä¸­çš„ä¸è‰¯ç”¨æˆ¶ç«¯é‡‘鑰交æ›è¨Šæ¯"
+
+#: src/err-codes.h:275
+msgid "Bogus string"
+msgstr "å‡é€ çš„字串"
+
+#: src/err-codes.h:276
+msgid "Forbidden"
+msgstr ""
+
+#: src/err-codes.h:277
+msgid "Key disabled"
+msgstr "金鑰已åœç”¨"
+
+#: src/err-codes.h:278
+msgid "Not possible with a card based key"
+msgstr "ä¸å¯èƒ½ä»¥å¡ç‰‡å¼é‡‘鑰進行"
+
+#: src/err-codes.h:279
+msgid "Invalid lock object"
+msgstr "無效的鎖定物件"
+
+#: src/err-codes.h:280
+msgid "True"
+msgstr ""
+
+#: src/err-codes.h:281
+msgid "False"
+msgstr ""
+
+#: src/err-codes.h:282
+msgid "General IPC error"
+msgstr "一般性的 IPC 錯誤"
+
+#: src/err-codes.h:283
+msgid "IPC accept call failed"
+msgstr "IPC 接å—å«ç”¨å¤±æ•—"
+
+#: src/err-codes.h:284
+msgid "IPC connect call failed"
+msgstr "IPC 連線å«ç”¨å¤±æ•—"
+
+#: src/err-codes.h:285
+msgid "Invalid IPC response"
+msgstr "無效的 IPC 回應"
+
+#: src/err-codes.h:286
+msgid "Invalid value passed to IPC"
+msgstr "éžé€è‡³ IPC 的值無效"
+
+#: src/err-codes.h:287
+msgid "Incomplete line passed to IPC"
+msgstr "éžé€è‡³ IPC 的列ä¸å®Œæ•´"
+
+#: src/err-codes.h:288
+msgid "Line passed to IPC too long"
+msgstr "éžé€è‡³ IPC 的列太長"
+
+#: src/err-codes.h:289
+msgid "Nested IPC commands"
+msgstr "巢狀 IPC 指令"
+
+#: src/err-codes.h:290
+msgid "No data callback in IPC"
+msgstr "IPC 中沒有資料回呼"
+
+#: src/err-codes.h:291
+msgid "No inquire callback in IPC"
+msgstr "IPC 中沒有查詢回呼"
+
+#: src/err-codes.h:292
+msgid "Not an IPC server"
+msgstr "ä¸æ˜¯ IPC 伺æœå™¨"
+
+#: src/err-codes.h:293
+msgid "Not an IPC client"
+msgstr "ä¸æ˜¯ IPC 用戶端"
+
+#: src/err-codes.h:294
+msgid "Problem starting IPC server"
+msgstr "å•Ÿå‹• IPC 伺æœå™¨æ™‚發生å•é¡Œ"
+
+#: src/err-codes.h:295
+msgid "IPC read error"
+msgstr "IPC 讀å–錯誤"
+
+#: src/err-codes.h:296
+msgid "IPC write error"
+msgstr "IPC 寫入錯誤"
+
+#: src/err-codes.h:297
+msgid "Too much data for IPC layer"
+msgstr "IPC 層有太多資料"
+
+#: src/err-codes.h:298
+msgid "Unexpected IPC command"
+msgstr "未é æœŸçš„ IPC 指令"
+
+#: src/err-codes.h:299
+msgid "Unknown IPC command"
+msgstr "未知的 IPC 指令"
+
+#: src/err-codes.h:300
+msgid "IPC syntax error"
+msgstr "IPC 語法錯誤"
+
+#: src/err-codes.h:301
+msgid "IPC call has been cancelled"
+msgstr "IPC å«ç”¨å·²å–消"
+
+#: src/err-codes.h:302
+msgid "No input source for IPC"
+msgstr "沒有 IPC 的輸入來æº"
+
+#: src/err-codes.h:303
+msgid "No output source for IPC"
+msgstr "沒有 IPC 的輸出來æº"
+
+#: src/err-codes.h:304
+msgid "IPC parameter error"
+msgstr "IPC åƒæ•¸éŒ¯èª¤"
+
+#: src/err-codes.h:305
+msgid "Unknown IPC inquire"
+msgstr "未知的 IPC 查詢"
+
+#: src/err-codes.h:306
+#, fuzzy
+#| msgid "No crypto engine"
+msgid "Crypto engine too old"
+msgstr "沒有密碼法引擎"
+
+#: src/err-codes.h:307
+msgid "Screen or window too small"
+msgstr ""
+
+#: src/err-codes.h:308
+msgid "Screen or window too large"
+msgstr ""
+
+#: src/err-codes.h:309
+msgid "Required environment variable not set"
+msgstr ""
+
+#: src/err-codes.h:310
+msgid "User ID already exists"
+msgstr ""
+
+#: src/err-codes.h:311
+msgid "Name already exists"
+msgstr ""
+
+#: src/err-codes.h:312
+#, fuzzy
+#| msgid "Duplicated value"
+msgid "Duplicated name"
+msgstr "é‡è¤‡çš„值"
+
+#: src/err-codes.h:313
+#, fuzzy
+#| msgid "Certificate too young"
+msgid "Object is too young"
+msgstr "憑證太年輕"
+
+#: src/err-codes.h:314
+#, fuzzy
+#| msgid "Provided object is too short"
+msgid "Object is too old"
+msgstr "æ供的物件太短"
+
+#: src/err-codes.h:315
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Unknown flag"
+msgstr "無效的å稱"
+
+#: src/err-codes.h:316
+#, fuzzy
+#| msgid "Invalid operation code"
+msgid "Invalid execution order"
+msgstr "無效的æ“作碼"
+
+#: src/err-codes.h:317
+msgid "Already fetched"
+msgstr ""
+
+#: src/err-codes.h:318
+msgid "Try again later"
+msgstr ""
+
+#: src/err-codes.h:319
+#, fuzzy
+#| msgid "Unknown name"
+msgid "Wrong name"
+msgstr "無效的å稱"
+
+#: src/err-codes.h:320
+msgid "System bug detected"
+msgstr ""
+
+#: src/err-codes.h:321
+#, fuzzy
+#| msgid "Unknown system error"
+msgid "Unknown DNS error"
+msgstr "未知的系統錯誤"
+
+#: src/err-codes.h:322
+#, fuzzy
+#| msgid "Invalid OID string"
+msgid "Invalid DNS section"
+msgstr "無效的 OID 字串"
+
+#: src/err-codes.h:323
+#, fuzzy
+#| msgid "Invalid S-expression"
+msgid "Invalid textual address form"
+msgstr "無效的 S-表示å¼"
+
+#: src/err-codes.h:324
+#, fuzzy
+#| msgid "Missing issuer certificate"
+msgid "Missing DNS query packet"
+msgstr "éºå¤±ç™¼è¡Œè€…憑證"
+
+#: src/err-codes.h:325
+msgid "Missing DNS answer packet"
+msgstr ""
+
+#: src/err-codes.h:326
+msgid "Connection closed in DNS"
+msgstr ""
+
+#: src/err-codes.h:327
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "Verification failed in DNS"
+msgstr "解密失敗"
+
+#: src/err-codes.h:328
+#, fuzzy
+#| msgid "Timeout"
+msgid "DNS Timeout"
+msgstr "逾時"
+
+#: src/err-codes.h:329
+#, fuzzy
+#| msgid "General IPC error"
+msgid "General LDAP error"
+msgstr "一般性的 IPC 錯誤"
+
+#: src/err-codes.h:330
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP attribute error"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:331
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP name error"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:332
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP security error"
+msgstr "一般性的 Assuan 錯誤"
+
+#: src/err-codes.h:333
+#, fuzzy
+#| msgid "General error"
+msgid "General LDAP service error"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:334
+#, fuzzy
+#| msgid "General Assuan error"
+msgid "General LDAP update error"
+msgstr "一般性的 Assuan 錯誤"
+
+#: src/err-codes.h:335
+msgid "Experimental LDAP error code"
+msgstr ""
+
+#: src/err-codes.h:336
+#, fuzzy
+#| msgid "IPC write error"
+msgid "Private LDAP error code"
+msgstr "IPC 寫入錯誤"
+
+#: src/err-codes.h:337
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other general LDAP error"
+msgstr "一般性的 IPC 錯誤"
+
+#: src/err-codes.h:338
+#, fuzzy
+#| msgid "IPC connect call failed"
+msgid "LDAP connecting failed (X)"
+msgstr "IPC 連線å«ç”¨å¤±æ•—"
+
+#: src/err-codes.h:339
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral limit exceeded"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:340
+msgid "LDAP client loop"
+msgstr ""
+
+#: src/err-codes.h:341
+#, fuzzy
+#| msgid "Card reset required"
+msgid "No LDAP results returned"
+msgstr "å¡ç‰‡éœ€è¦é‡è¨­"
+
+#: src/err-codes.h:342
+#, fuzzy
+#| msgid "Element not found"
+msgid "LDAP control not found"
+msgstr "找ä¸åˆ°å…ƒç´ "
+
+#: src/err-codes.h:343
+#, fuzzy
+#| msgid "Not supported"
+msgid "Not supported by LDAP"
+msgstr "未支æ´"
+
+#: src/err-codes.h:344
+#, fuzzy
+#| msgid "Unexpected error"
+msgid "LDAP connect error"
+msgstr "未é æœŸçš„錯誤"
+
+#: src/err-codes.h:345
+msgid "Out of memory in LDAP"
+msgstr ""
+
+#: src/err-codes.h:346
+msgid "Bad parameter to an LDAP routine"
+msgstr ""
+
+#: src/err-codes.h:347
+#, fuzzy
+#| msgid "Unsupported operation"
+msgid "User cancelled LDAP operation"
+msgstr "未支æ´çš„æ“作"
+
+#: src/err-codes.h:348
+#, fuzzy
+#| msgid "Bad certificate"
+msgid "Bad LDAP search filter"
+msgstr "ä¸è‰¯çš„憑證"
+
+#: src/err-codes.h:349
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "Unknown LDAP authentication method"
+msgstr "未知的擴充"
+
+#: src/err-codes.h:350
+#, fuzzy
+#| msgid "Timeout"
+msgid "Timeout in LDAP"
+msgstr "逾時"
+
+#: src/err-codes.h:351
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP decoding error"
+msgstr "dirmngr 錯誤"
+
+#: src/err-codes.h:352
+#, fuzzy
+#| msgid "dirmngr error"
+msgid "LDAP encoding error"
+msgstr "dirmngr 錯誤"
+
+#: src/err-codes.h:353
+#, fuzzy
+#| msgid "IPC read error"
+msgid "LDAP local error"
+msgstr "IPC 讀å–錯誤"
+
+#: src/err-codes.h:354
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot contact LDAP server"
+msgstr "ä¸æ˜¯ IPC 伺æœå™¨"
+
+#: src/err-codes.h:355
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP success"
+msgstr "æˆåŠŸ"
+
+#: src/err-codes.h:356
+#, fuzzy
+#| msgid "Configuration error"
+msgid "LDAP operations error"
+msgstr "組態錯誤"
+
+#: src/err-codes.h:357
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP protocol error"
+msgstr "未ä¾å”定進行"
+
+#: src/err-codes.h:358
+msgid "Time limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:359
+msgid "Size limit exceeded in LDAP"
+msgstr ""
+
+#: src/err-codes.h:360
+msgid "LDAP compare false"
+msgstr ""
+
+#: src/err-codes.h:361
+msgid "LDAP compare true"
+msgstr ""
+
+#: src/err-codes.h:362
+#, fuzzy
+#| msgid "Unknown extension"
+msgid "LDAP authentication method not supported"
+msgstr "未知的擴充"
+
+#: src/err-codes.h:363
+msgid "Strong(er) LDAP authentication required"
+msgstr ""
+
+#: src/err-codes.h:364
+#, fuzzy
+#| msgid "Fatal alert message received"
+msgid "Partial LDAP results+referral received"
+msgstr "已收到嚴é‡è­¦å‘Šè¨Šæ¯"
+
+#: src/err-codes.h:365
+#, fuzzy
+#| msgid "General error"
+msgid "LDAP referral"
+msgstr "一般錯誤"
+
+#: src/err-codes.h:366
+msgid "Administrative LDAP limit exceeded"
+msgstr ""
+
+#: src/err-codes.h:367
+msgid "Critical LDAP extension is unavailable"
+msgstr ""
+
+#: src/err-codes.h:368
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Confidentiality required by LDAP"
+msgstr "å¡ç‰‡éœ€è¦é‡è¨­"
+
+#: src/err-codes.h:369
+msgid "LDAP SASL bind in progress"
+msgstr ""
+
+#: src/err-codes.h:370
+msgid "No such LDAP attribute"
+msgstr ""
+
+#: src/err-codes.h:371
+#, fuzzy
+#| msgid "Invalid attribute"
+msgid "Undefined LDAP attribute type"
+msgstr "無效的屬性"
+
+#: src/err-codes.h:372
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate matching in LDAP"
+msgstr "未支æ´çš„ä¿è­·"
+
+#: src/err-codes.h:373
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Constraint violation in LDAP"
+msgstr "未ä¾å”定進行"
+
+#: src/err-codes.h:374
+msgid "LDAP type or value exists"
+msgstr ""
+
+#: src/err-codes.h:375
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid syntax in LDAP"
+msgstr "無效的狀態"
+
+#: src/err-codes.h:376
+#, fuzzy
+#| msgid "No CMS object"
+msgid "No such LDAP object"
+msgstr "ä¸æ˜¯ CMS 物件"
+
+#: src/err-codes.h:377
+#, fuzzy
+#| msgid "Hardware problem"
+msgid "LDAP alias problem"
+msgstr "硬體å•é¡Œ"
+
+#: src/err-codes.h:378
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid DN syntax in LDAP"
+msgstr "無效的狀態"
+
+#: src/err-codes.h:379
+msgid "LDAP entry is a leaf"
+msgstr ""
+
+#: src/err-codes.h:380
+#, fuzzy
+#| msgid "Encoding problem"
+msgid "LDAP alias dereferencing problem"
+msgstr "編碼å•é¡Œ"
+
+#: src/err-codes.h:381
+msgid "LDAP proxy authorization failure (X)"
+msgstr ""
+
+#: src/err-codes.h:382
+#, fuzzy
+#| msgid "Unsupported protection"
+msgid "Inappropriate LDAP authentication"
+msgstr "未支æ´çš„ä¿è­·"
+
+#: src/err-codes.h:383
+#, fuzzy
+#| msgid "Invalid card"
+msgid "Invalid LDAP credentials"
+msgstr "無效的å¡ç‰‡"
+
+#: src/err-codes.h:384
+msgid "Insufficient access for LDAP"
+msgstr ""
+
+#: src/err-codes.h:385
+msgid "LDAP server is busy"
+msgstr ""
+
+#: src/err-codes.h:386
+#, fuzzy
+#| msgid "No keyserver available"
+msgid "LDAP server is unavailable"
+msgstr "沒有å¯ç”¨çš„金鑰伺æœå™¨"
+
+#: src/err-codes.h:387
+msgid "LDAP server is unwilling to perform"
+msgstr ""
+
+#: src/err-codes.h:388
+msgid "Loop detected by LDAP"
+msgstr ""
+
+#: src/err-codes.h:389
+#, fuzzy
+#| msgid "Missing action"
+msgid "LDAP naming violation"
+msgstr "éºå¤±è¡Œå‹•"
+
+#: src/err-codes.h:390
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "LDAP object class violation"
+msgstr "未ä¾å”定進行"
+
+#: src/err-codes.h:391
+#, fuzzy
+#| msgid "Operation not yet finished"
+msgid "LDAP operation not allowed on non-leaf"
+msgstr "æ“作尚未完æˆ"
+
+#: src/err-codes.h:392
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation not allowed on RDN"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:393
+msgid "Already exists (LDAP)"
+msgstr ""
+
+#: src/err-codes.h:394
+msgid "Cannot modify LDAP object class"
+msgstr ""
+
+#: src/err-codes.h:395
+#, fuzzy
+#| msgid "Line too long"
+msgid "LDAP results too large"
+msgstr "列太長"
+
+#: src/err-codes.h:396
+#, fuzzy
+#| msgid "Operation cancelled"
+msgid "LDAP operation affects multiple DSAs"
+msgstr "æ“作已å–消"
+
+#: src/err-codes.h:397
+msgid "Virtual LDAP list view error"
+msgstr ""
+
+#: src/err-codes.h:398
+#, fuzzy
+#| msgid "General IPC error"
+msgid "Other LDAP error"
+msgstr "一般性的 IPC 錯誤"
+
+#: src/err-codes.h:399
+#, fuzzy
+#| msgid "Resources exhausted"
+msgid "Resources exhausted in LCUP"
+msgstr "資æºå·²è€—盡"
+
+#: src/err-codes.h:400
+#, fuzzy
+#| msgid "Protocol violation"
+msgid "Security violation in LCUP"
+msgstr "未ä¾å”定進行"
+
+#: src/err-codes.h:401
+#, fuzzy
+#| msgid "Invalid state"
+msgid "Invalid data in LCUP"
+msgstr "無效的狀態"
+
+#: src/err-codes.h:402
+#, fuzzy
+#| msgid "Unsupported certificate"
+msgid "Unsupported scheme in LCUP"
+msgstr "未支æ´çš„憑證"
+
+#: src/err-codes.h:403
+#, fuzzy
+#| msgid "Card reset required"
+msgid "Reload required in LCUP"
+msgstr "å¡ç‰‡éœ€è¦é‡è¨­"
+
+#: src/err-codes.h:404
+#, fuzzy
+#| msgid "Success"
+msgid "LDAP cancelled"
+msgstr "æˆåŠŸ"
+
+#: src/err-codes.h:405
+#, fuzzy
+#| msgid "Not operational"
+msgid "No LDAP operation to cancel"
+msgstr "無法æ“作"
+
+#: src/err-codes.h:406
+#, fuzzy
+#| msgid "Not operational"
+msgid "Too late to cancel LDAP"
+msgstr "無法æ“作"
+
+#: src/err-codes.h:407
+#, fuzzy
+#| msgid "Not an IPC server"
+msgid "Cannot cancel LDAP"
+msgstr "ä¸æ˜¯ IPC 伺æœå™¨"
+
+#: src/err-codes.h:408
+#, fuzzy
+#| msgid "Decryption failed"
+msgid "LDAP assertion failed"
+msgstr "解密失敗"
+
+#: src/err-codes.h:409
+msgid "Proxied authorization denied by LDAP"
+msgstr ""
+
+#: src/err-codes.h:410
+msgid "User defined error code 1"
+msgstr "使用者定義錯誤代碼 1"
+
+#: src/err-codes.h:411
+msgid "User defined error code 2"
+msgstr "使用者定義錯誤代碼 2"
+
+#: src/err-codes.h:412
+msgid "User defined error code 3"
+msgstr "使用者定義錯誤代碼 3"
+
+#: src/err-codes.h:413
+msgid "User defined error code 4"
+msgstr "使用者定義錯誤代碼 4"
+
+#: src/err-codes.h:414
+msgid "User defined error code 5"
+msgstr "使用者定義錯誤代碼 5"
+
+#: src/err-codes.h:415
+msgid "User defined error code 6"
+msgstr "使用者定義錯誤代碼 6"
+
+#: src/err-codes.h:416
+msgid "User defined error code 7"
+msgstr "使用者定義錯誤代碼 7"
+
+#: src/err-codes.h:417
+msgid "User defined error code 8"
+msgstr "使用者定義錯誤代碼 8"
+
+#: src/err-codes.h:418
+msgid "User defined error code 9"
+msgstr "使用者定義錯誤代碼 9"
+
+#: src/err-codes.h:419
+msgid "User defined error code 10"
+msgstr "使用者定義錯誤代碼 10"
+
+#: src/err-codes.h:420
+msgid "User defined error code 11"
+msgstr "使用者定義錯誤代碼 11"
+
+#: src/err-codes.h:421
+msgid "User defined error code 12"
+msgstr "使用者定義錯誤代碼 12"
+
+#: src/err-codes.h:422
+msgid "User defined error code 13"
+msgstr "使用者定義錯誤代碼 13"
+
+#: src/err-codes.h:423
+msgid "User defined error code 14"
+msgstr "使用者定義錯誤代碼 14"
+
+#: src/err-codes.h:424
+msgid "User defined error code 15"
+msgstr "使用者定義錯誤代碼 15"
+
+#: src/err-codes.h:425
+msgid "User defined error code 16"
+msgstr "使用者定義錯誤代碼 16"
+
+#: src/err-codes.h:426
+msgid "System error w/o errno"
+msgstr "系統錯誤但是沒有 errno"
+
+#: src/err-codes.h:427
+msgid "Unknown system error"
+msgstr "未知的系統錯誤"
+
+#: src/err-codes.h:428
+msgid "End of file"
+msgstr "檔案çµå°¾"
+
+#: src/err-codes.h:429
+msgid "Unknown error code"
+msgstr "未知的錯誤代碼"
+
+#: src/gpg-error.c:450
+#, c-format
+msgid "Usage: %s GPG-ERROR [...]\n"
+msgstr "用法: %s GPG-ERROR [...]\n"
+
+#: src/gpg-error.c:633
+#, c-format
+msgid "%s: warning: could not recognize %s\n"
+msgstr "%s: 警告: 無法辨識 %s\n"
+
+#, fuzzy
+#~| msgid "Resources exhausted"
+#~ msgid "LCUP Resources exhausted"
+#~ msgstr "資æºå·²è€—盡"
+
+#, fuzzy
+#~| msgid "Invalid data"
+#~ msgid "LCUP Invalid data"
+#~ msgstr "無效的資料"
+
+#, fuzzy
+#~| msgid "General error"
+#~ msgid "LDAP Other general error"
+#~ msgstr "一般錯誤"
+
+#, fuzzy
+#~| msgid "dirmngr error"
+#~ msgid "Encoding error"
+#~ msgstr "dirmngr 錯誤"
diff --git a/src/Makefile.am b/src/Makefile.am
index e201cee..398ec5e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -14,7 +14,7 @@
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
# We distribute the generated sources err-sources.h and err-codes.h,
# because they are needed to build the po directory, and they don't
@@ -41,11 +41,43 @@ endif
# Distributed lock object definitions for cross compilation.
lock_obj_pub = \
- syscfg/lock-obj-pub.mingw32.h \
- syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h
+ syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.aarch64-apple-darwin.h \
+ syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h \
+ syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h \
+ syscfg/lock-obj-pub.arm-apple-darwin.h \
+ syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.i386-apple-darwin.h \
+ syscfg/lock-obj-pub.i686-pc-gnu.h \
+ syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h \
+ syscfg/lock-obj-pub.i686-pc-linux-gnu.h \
+ syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mips-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h \
+ syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h \
+ syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h \
+ syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.x86_64-apple-darwin.h \
+ syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-musl.h \
+ syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mingw32.h
+
lib_LTLIBRARIES = libgpg-error.la
-include_HEADERS = gpg-error.h
+nodist_include_HEADERS = gpg-error.h gpgrt.h
bin_SCRIPTS = gpg-error-config
m4datadir = $(datadir)/aclocal
m4data_DATA = gpg-error.m4
@@ -55,22 +87,29 @@ EXTRA_DIST = mkstrtable.awk err-sources.h.in err-codes.h.in \
mkerrcodes.awk mkerrcodes1.awk mkerrcodes2.awk mkerrcodes.c \
mkheader.c gpg-error.h.in mkw32errmap.c w32-add.h w32ce-add.h \
err-sources.h err-codes.h gpg-error-config.in gpg-error.m4 \
- gpg-error.def.in versioninfo.rc.in \
+ gpg-error.vers gpg-error.def.in \
+ versioninfo.rc.in gpg-error.w32-manifest.in \
$(lock_obj_pub)
BUILT_SOURCES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
- err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h \
+ err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h gpgrt.h \
gpg-error.def mkw32errmap.map.c
tmp_files = _mkerrcodes.h _gpg-error.def.h mkw32errmap.tab.h mkw32errmap.map.c
CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
- gpg-error.h mkerrcodes mkerrcodes.h gpg-error.def mkw32errmap.tab.h \
+ gpg-error.h gpgrt.h \
+ mkerrcodes mkerrcodes.h gpg-error.def mkw32errmap.tab.h \
mkw32errmap.map.c err-sources-sym.h err-codes-sym.h errnos-sym.h \
gpg-extra/errno.h mkheader $(tmp_files) lock-obj-pub.native.h
+
+#
+# {{{ Begin Windows part
+#
if HAVE_W32_SYSTEM
-arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c
+arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c \
+ w32-iconv.c w32-estream.c
RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS) $(CPPFLAGS)
LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
@@ -83,6 +122,13 @@ SUFFIXES = .rc .lo
gpg_error_res = versioninfo.lo
no_undefined = -no-undefined
export_symbols = -export-symbols gpg-error.def
+# i686-w64-mingw32.gcc version 4.9.1 takes the long long helper
+# functions from libgcc_s_sjlj-1.dll and not from a static libgcc. As
+# a plain C program we do not use exception handler and thus there is
+# no need to use this DLL. Thus we force gcc to link that statically.
+extra_ltoptions = -XCClinker -static-libgcc
+
+versioninfo.lo : gpg-error.w32-manifest
install-def-file: gpg-error.def
-$(INSTALL) -d $(DESTDIR)$(libdir)
@@ -94,26 +140,49 @@ uninstall-def-file:
libgpg_error_la_DEPENDENCIES = $(gpg_error_res) gpg-error.def
intllibs =
+#
+# }}} End Windows part
+#
else
+#
+# {{{ Begin Unix part
+#
arch_sources = posix-lock.c posix-lock-obj.h posix-thread.c
gpg_error_res =
no_undefined =
export_symbols =
+extra_ltoptions =
+
install-def-file:
uninstall-def-file:
intllibs = @LTLIBINTL@
endif
+#
+# }}} End Unix part
+#
+
+if HAVE_LD_VERSION_SCRIPT
+ libgpg_error_vers_opt = -Wl,--version-script=$(srcdir)/gpg-error.vers
+else
+ libgpg_error_vers_opt =
+endif
+libgpg_error_la_LDFLAGS = \
+ $(no_undefined) $(export_symbols) $(libgpg_error_vers_opt) \
+ $(extra_ltoptions) -version-info \
+ @LIBGPG_ERROR_LT_CURRENT@:@LIBGPG_ERROR_LT_REVISION@:@LIBGPG_ERROR_LT_AGE@
-libgpg_error_la_LDFLAGS = -version-info \
- @LIBGPG_ERROR_LT_CURRENT@:@LIBGPG_ERROR_LT_REVISION@:@LIBGPG_ERROR_LT_AGE@ \
- $(no_undefined) $(export_symbols)
+libgpg_error_la_SOURCES = gettext.h $(arch_sources) \
+ gpgrt-int.h init.c init.h version.c lock.h thread.h \
+ estream.c estream-printf.c estream-printf.h \
+ strsource.c strerror.c code-to-errno.c code-from-errno.c \
+ visibility.c visibility.h b64dec.c
+nodist_libgpg_error_la_SOURCES = gpg-error.h
-libgpg_error_la_SOURCES = gpg-error.h gettext.h $(arch_sources) \
- init.c init.h version.c lock.h thread.h \
- strsource.c strerror.c code-to-errno.c code-from-errno.c
+# libgpg_error_la_DEPENDENCIES = \
+# $(srcdir)/gpg-error.vers
# Note that RCCOMPILE needs the same defines as ..._la_CPPFLAGS but
# without the extra_cppflags because they may include am -idirafter
@@ -122,8 +191,9 @@ libgpg_error_la_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
libgpg_error_la_LIBADD = $(gpg_error_res) $(intllibs) $(LIBTHREAD)
gpg_error_SOURCES = strsource-sym.c strerror-sym.c gpg-error.c
-gpg_error_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
-gpg_error_LDADD = ./libgpg-error.la @LTLIBINTL@
+gpg_error_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" \
+ -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
+gpg_error_LDADD = ./libgpg-error.la $(LTLIBINTL)
# We build err-sources.h and err-codes.h in the source directory.
# This is needed because gettext does only look into the source
@@ -152,7 +222,7 @@ code-to-errno.h: Makefile mkerrnos.awk errnos.in
# It is correct to use $(CPP). We want the host's idea of the error codes.
mkerrcodes.h: Makefile mkerrcodes.awk $(gpg_extra_headers)
$(AWK) -f $(srcdir)/mkerrcodes1.awk $(srcdir)/errnos.in >_$@
- $(CPP) $(CPPFLAGS) $(extra_cppflags) _$@ | grep GPG_ERR_ | \
+ $(CPP) $(CPPFLAGS) $(extra_cppflags) -P _$@ | grep GPG_ERR_ | \
$(AWK) -f $(srcdir)/mkerrcodes.awk >$@
-rm _$@
@@ -212,25 +282,29 @@ parts_of_gpg_error_h = \
w32ce-add.h \
$(lock_obj_pub)
-# If we are cross-compiling we better make sure that no stale native
-# lock include file will be found by mkheader.
-if CROSS_COMPILING
-pre_mkheader_cmds = -rm lock-obj-pub.native.h 2>/dev/null
+# If we are cross-compiling or building on Windows we better make sure
+# that no stale native lock include file will be found by mkheader.
+if FORCE_USE_SYSCFG
+pre_mkheader_cmds = if test -f lock-obj-pub.native.h; \
+ then rm lock-obj-pub.native.h; fi
else
pre_mkheader_cmds = :
parts_of_gpg_error_h += ./lock-obj-pub.native.h
-lock-obj-pub.native.h: Makefile gen-posix-lock-obj posix-lock-obj.h
+./lock-obj-pub.native.h: Makefile gen-posix-lock-obj$(EXEEXT) posix-lock-obj.h
./gen-posix-lock-obj >$@
endif
# We also depend on versioninfo.rc because that is build by
# config.status and thus has up-to-date version numbers.
-gpg-error.h: Makefile mkheader $(parts_of_gpg_error_h) versioninfo.rc
+gpg-error.h: Makefile mkheader $(parts_of_gpg_error_h) \
+ versioninfo.rc ../config.h
$(pre_mkheader_cmds)
./mkheader $(host_os) $(host_triplet) $(srcdir)/gpg-error.h.in \
- $(PACKAGE_VERSION) $(VERSION_NUMBER) >$@
+ ../config.h $(PACKAGE_VERSION) $(VERSION_NUMBER) >$@
+gpgrt.h: gpg-error.h
+ cp gpg-error.h gpgrt.h
install-data-local:
if HAVE_W32CE_SYSTEM
diff --git a/src/Makefile.in b/src/Makefile.in
index 0161a23..e02b683 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -31,7 +30,7 @@
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, see <http://www.gnu.org/licenses/>.
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
# We distribute the generated sources err-sources.h and err-codes.h,
# because they are needed to build the po directory, and they don't
@@ -42,23 +41,51 @@
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
esac; \
- test $$am__dry = yes; \
- }
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -84,26 +111,30 @@ bin_PROGRAMS = gpg-error$(EXEEXT)
@HAVE_W32_SYSTEM_FALSE@ $(am__DEPENDENCIES_1) \
@HAVE_W32_SYSTEM_FALSE@ $(am__DEPENDENCIES_2) \
@HAVE_W32_SYSTEM_FALSE@ $(am__DEPENDENCIES_2)
-@CROSS_COMPILING_FALSE@am__append_1 = ./lock-obj-pub.native.h
+@FORCE_USE_SYSCFG_FALSE@am__append_1 = ./lock-obj-pub.native.h
subdir = src
-DIST_COMMON = README $(include_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in $(srcdir)/gpg-error-config.in \
- $(srcdir)/versioninfo.rc.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(srcdir)/versioninfo.rc.in \
+ $(srcdir)/gpg-error.w32-manifest.in \
+ $(srcdir)/gpg-error-config.in $(top_srcdir)/build-aux/depcomp \
+ README
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = versioninfo.rc gpg-error-config
+CONFIG_CLEAN_FILES = versioninfo.rc gpg-error.w32-manifest \
+ gpg-error-config
CONFIG_CLEAN_VPATH_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
@@ -138,24 +169,33 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
LTLIBRARIES = $(lib_LTLIBRARIES)
@HAVE_W32_SYSTEM_TRUE@am__DEPENDENCIES_1 = versioninfo.lo
am__DEPENDENCIES_2 =
-am__libgpg_error_la_SOURCES_DIST = gpg-error.h gettext.h posix-lock.c \
+am__libgpg_error_la_SOURCES_DIST = gettext.h posix-lock.c \
posix-lock-obj.h posix-thread.c w32-gettext.c w32-lock.c \
- w32-lock-obj.h w32-thread.c init.c init.h version.c lock.h \
- thread.h strsource.c strerror.c code-to-errno.c \
- code-from-errno.c
+ w32-lock-obj.h w32-thread.c w32-iconv.c w32-estream.c \
+ gpgrt-int.h init.c init.h version.c lock.h thread.h estream.c \
+ estream-printf.c estream-printf.h strsource.c strerror.c \
+ code-to-errno.c code-from-errno.c visibility.c visibility.h \
+ b64dec.c
@HAVE_W32_SYSTEM_FALSE@am__objects_1 = libgpg_error_la-posix-lock.lo \
@HAVE_W32_SYSTEM_FALSE@ libgpg_error_la-posix-thread.lo
@HAVE_W32_SYSTEM_TRUE@am__objects_1 = libgpg_error_la-w32-gettext.lo \
@HAVE_W32_SYSTEM_TRUE@ libgpg_error_la-w32-lock.lo \
-@HAVE_W32_SYSTEM_TRUE@ libgpg_error_la-w32-thread.lo
+@HAVE_W32_SYSTEM_TRUE@ libgpg_error_la-w32-thread.lo \
+@HAVE_W32_SYSTEM_TRUE@ libgpg_error_la-w32-iconv.lo \
+@HAVE_W32_SYSTEM_TRUE@ libgpg_error_la-w32-estream.lo
am_libgpg_error_la_OBJECTS = $(am__objects_1) libgpg_error_la-init.lo \
- libgpg_error_la-version.lo libgpg_error_la-strsource.lo \
+ libgpg_error_la-version.lo libgpg_error_la-estream.lo \
+ libgpg_error_la-estream-printf.lo libgpg_error_la-strsource.lo \
libgpg_error_la-strerror.lo libgpg_error_la-code-to-errno.lo \
- libgpg_error_la-code-from-errno.lo
-libgpg_error_la_OBJECTS = $(am_libgpg_error_la_OBJECTS)
+ libgpg_error_la-code-from-errno.lo \
+ libgpg_error_la-visibility.lo libgpg_error_la-b64dec.lo
+nodist_libgpg_error_la_OBJECTS =
+libgpg_error_la_OBJECTS = $(am_libgpg_error_la_OBJECTS) \
+ $(nodist_libgpg_error_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
+am__v_lt_1 =
libgpg_error_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(AM_CFLAGS) $(CFLAGS) $(libgpg_error_la_LDFLAGS) $(LDFLAGS) \
@@ -170,8 +210,20 @@ gen_w32_lock_obj_LDADD = $(LDADD)
am_gpg_error_OBJECTS = gpg_error-strsource-sym.$(OBJEXT) \
gpg_error-strerror-sym.$(OBJEXT) gpg_error-gpg-error.$(OBJEXT)
gpg_error_OBJECTS = $(am_gpg_error_OBJECTS)
-gpg_error_DEPENDENCIES = ./libgpg-error.la
+gpg_error_DEPENDENCIES = ./libgpg-error.la $(am__DEPENDENCIES_2)
SCRIPTS = $(bin_SCRIPTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
am__depfiles_maybe = depfiles
@@ -184,22 +236,18 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = $(libgpg_error_la_SOURCES) gen-posix-lock-obj.c \
- gen-w32-lock-obj.c $(gpg_error_SOURCES)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libgpg_error_la_SOURCES) $(nodist_libgpg_error_la_SOURCES) \
+ gen-posix-lock-obj.c gen-w32-lock-obj.c $(gpg_error_SOURCES)
DIST_SOURCES = $(am__libgpg_error_la_SOURCES_DIST) \
gen-posix-lock-obj.c gen-w32-lock-obj.c $(gpg_error_SOURCES)
am__can_run_installinfo = \
@@ -208,7 +256,24 @@ am__can_run_installinfo = \
*) (install-info --version) >/dev/null 2>&1;; \
esac
DATA = $(m4data_DATA)
-HEADERS = $(include_HEADERS)
+HEADERS = $(nodist_include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -224,6 +289,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -271,6 +337,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -371,11 +438,42 @@ top_srcdir = @top_srcdir@
# Distributed lock object definitions for cross compilation.
lock_obj_pub = \
- syscfg/lock-obj-pub.mingw32.h \
- syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h
+ syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.aarch64-apple-darwin.h \
+ syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h \
+ syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h \
+ syscfg/lock-obj-pub.arm-apple-darwin.h \
+ syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.i386-apple-darwin.h \
+ syscfg/lock-obj-pub.i686-pc-gnu.h \
+ syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h \
+ syscfg/lock-obj-pub.i686-pc-linux-gnu.h \
+ syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mips-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h \
+ syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h \
+ syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h \
+ syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.x86_64-apple-darwin.h \
+ syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h \
+ syscfg/lock-obj-pub.x86_64-pc-linux-musl.h \
+ syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h \
+ syscfg/lock-obj-pub.mingw32.h
lib_LTLIBRARIES = libgpg-error.la
-include_HEADERS = gpg-error.h
+nodist_include_HEADERS = gpg-error.h gpgrt.h
bin_SCRIPTS = gpg-error-config
m4datadir = $(datadir)/aclocal
m4data_DATA = gpg-error.m4
@@ -384,21 +482,36 @@ EXTRA_DIST = mkstrtable.awk err-sources.h.in err-codes.h.in \
mkerrcodes.awk mkerrcodes1.awk mkerrcodes2.awk mkerrcodes.c \
mkheader.c gpg-error.h.in mkw32errmap.c w32-add.h w32ce-add.h \
err-sources.h err-codes.h gpg-error-config.in gpg-error.m4 \
- gpg-error.def.in versioninfo.rc.in \
+ gpg-error.vers gpg-error.def.in \
+ versioninfo.rc.in gpg-error.w32-manifest.in \
$(lock_obj_pub)
BUILT_SOURCES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
- err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h \
+ err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h gpgrt.h \
gpg-error.def mkw32errmap.map.c
tmp_files = _mkerrcodes.h _gpg-error.def.h mkw32errmap.tab.h mkw32errmap.map.c
CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
- gpg-error.h mkerrcodes mkerrcodes.h gpg-error.def mkw32errmap.tab.h \
+ gpg-error.h gpgrt.h \
+ mkerrcodes mkerrcodes.h gpg-error.def mkw32errmap.tab.h \
mkw32errmap.map.c err-sources-sym.h err-codes-sym.h errnos-sym.h \
gpg-extra/errno.h mkheader $(tmp_files) lock-obj-pub.native.h
+
+#
+# }}} End Windows part
+#
+#
+# {{{ Begin Unix part
+#
@HAVE_W32_SYSTEM_FALSE@arch_sources = posix-lock.c posix-lock-obj.h posix-thread.c
-@HAVE_W32_SYSTEM_TRUE@arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c
+
+#
+# {{{ Begin Windows part
+#
+@HAVE_W32_SYSTEM_TRUE@arch_sources = w32-gettext.c w32-lock.c w32-lock-obj.h w32-thread.c \
+@HAVE_W32_SYSTEM_TRUE@ w32-iconv.c w32-estream.c
+
@HAVE_W32_SYSTEM_TRUE@RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
@HAVE_W32_SYSTEM_TRUE@ -DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS) $(CPPFLAGS)
@@ -410,17 +523,36 @@ CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
@HAVE_W32_SYSTEM_TRUE@no_undefined = -no-undefined
@HAVE_W32_SYSTEM_FALSE@export_symbols =
@HAVE_W32_SYSTEM_TRUE@export_symbols = -export-symbols gpg-error.def
+@HAVE_W32_SYSTEM_FALSE@extra_ltoptions =
+# i686-w64-mingw32.gcc version 4.9.1 takes the long long helper
+# functions from libgcc_s_sjlj-1.dll and not from a static libgcc. As
+# a plain C program we do not use exception handler and thus there is
+# no need to use this DLL. Thus we force gcc to link that statically.
+@HAVE_W32_SYSTEM_TRUE@extra_ltoptions = -XCClinker -static-libgcc
@HAVE_W32_SYSTEM_TRUE@libgpg_error_la_DEPENDENCIES = $(gpg_error_res) gpg-error.def
@HAVE_W32_SYSTEM_FALSE@intllibs = @LTLIBINTL@
@HAVE_W32_SYSTEM_TRUE@intllibs =
-libgpg_error_la_LDFLAGS = -version-info \
- @LIBGPG_ERROR_LT_CURRENT@:@LIBGPG_ERROR_LT_REVISION@:@LIBGPG_ERROR_LT_AGE@ \
- $(no_undefined) $(export_symbols)
+@HAVE_LD_VERSION_SCRIPT_FALSE@libgpg_error_vers_opt =
-libgpg_error_la_SOURCES = gpg-error.h gettext.h $(arch_sources) \
- init.c init.h version.c lock.h thread.h \
- strsource.c strerror.c code-to-errno.c code-from-errno.c
+#
+# }}} End Unix part
+#
+@HAVE_LD_VERSION_SCRIPT_TRUE@libgpg_error_vers_opt = -Wl,--version-script=$(srcdir)/gpg-error.vers
+libgpg_error_la_LDFLAGS = \
+ $(no_undefined) $(export_symbols) $(libgpg_error_vers_opt) \
+ $(extra_ltoptions) -version-info \
+ @LIBGPG_ERROR_LT_CURRENT@:@LIBGPG_ERROR_LT_REVISION@:@LIBGPG_ERROR_LT_AGE@
+libgpg_error_la_SOURCES = gettext.h $(arch_sources) \
+ gpgrt-int.h init.c init.h version.c lock.h thread.h \
+ estream.c estream-printf.c estream-printf.h \
+ strsource.c strerror.c code-to-errno.c code-from-errno.c \
+ visibility.c visibility.h b64dec.c
+
+nodist_libgpg_error_la_SOURCES = gpg-error.h
+
+# libgpg_error_la_DEPENDENCIES = \
+# $(srcdir)/gpg-error.vers
# Note that RCCOMPILE needs the same defines as ..._la_CPPFLAGS but
# without the extra_cppflags because they may include am -idirafter
@@ -428,16 +560,20 @@ libgpg_error_la_SOURCES = gpg-error.h gettext.h $(arch_sources) \
libgpg_error_la_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
libgpg_error_la_LIBADD = $(gpg_error_res) $(intllibs) $(LIBTHREAD)
gpg_error_SOURCES = strsource-sym.c strerror-sym.c gpg-error.c
-gpg_error_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
-gpg_error_LDADD = ./libgpg-error.la @LTLIBINTL@
+gpg_error_CPPFLAGS = -DPKGDATADIR=\"$(pkgdatadir)\" \
+ -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
+
+gpg_error_LDADD = ./libgpg-error.la $(LTLIBINTL)
parts_of_gpg_error_h = gpg-error.h.in err-sources.h.in err-codes.h.in \
errnos.in w32-add.h w32ce-add.h $(lock_obj_pub) \
$(am__append_1)
-@CROSS_COMPILING_FALSE@pre_mkheader_cmds = :
+@FORCE_USE_SYSCFG_FALSE@pre_mkheader_cmds = :
+
+# If we are cross-compiling or building on Windows we better make sure
+# that no stale native lock include file will be found by mkheader.
+@FORCE_USE_SYSCFG_TRUE@pre_mkheader_cmds = if test -f lock-obj-pub.native.h; \
+@FORCE_USE_SYSCFG_TRUE@ then rm lock-obj-pub.native.h; fi
-# If we are cross-compiling we better make sure that no stale native
-# lock include file will be found by mkheader.
-@CROSS_COMPILING_TRUE@pre_mkheader_cmds = -rm lock-obj-pub.native.h 2>/dev/null
all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -475,8 +611,11 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
versioninfo.rc: $(top_builddir)/config.status $(srcdir)/versioninfo.rc.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gpg-error.w32-manifest: $(top_builddir)/config.status $(srcdir)/gpg-error.w32-manifest.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
gpg-error-config: $(top_builddir)/config.status $(srcdir)/gpg-error-config.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
@@ -503,12 +642,15 @@ uninstall-libLTLIBRARIES:
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
libgpg-error.la: $(libgpg_error_la_OBJECTS) $(libgpg_error_la_DEPENDENCIES) $(EXTRA_libgpg_error_la_DEPENDENCIES)
$(AM_V_CCLD)$(libgpg_error_la_LINK) -rpath $(libdir) $(libgpg_error_la_OBJECTS) $(libgpg_error_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@@ -520,10 +662,12 @@ install-binPROGRAMS: $(bin_PROGRAMS)
fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p || test -f $$p1; \
- then echo "$$p"; echo "$$p"; else :; fi; \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
done | \
- sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
sed 'N;N;N;s,\n, ,g' | \
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -544,7 +688,8 @@ uninstall-binPROGRAMS:
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
files=`for p in $$list; do echo "$$p"; done | \
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' `; \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
test -n "$$list" || exit 0; \
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -566,12 +711,15 @@ clean-noinstPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
+
gen-posix-lock-obj$(EXEEXT): $(gen_posix_lock_obj_OBJECTS) $(gen_posix_lock_obj_DEPENDENCIES) $(EXTRA_gen_posix_lock_obj_DEPENDENCIES)
@rm -f gen-posix-lock-obj$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gen_posix_lock_obj_OBJECTS) $(gen_posix_lock_obj_LDADD) $(LIBS)
+
gen-w32-lock-obj$(EXEEXT): $(gen_w32_lock_obj_OBJECTS) $(gen_w32_lock_obj_DEPENDENCIES) $(EXTRA_gen_w32_lock_obj_DEPENDENCIES)
@rm -f gen-w32-lock-obj$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gen_w32_lock_obj_OBJECTS) $(gen_w32_lock_obj_LDADD) $(LIBS)
+
gpg-error$(EXEEXT): $(gpg_error_OBJECTS) $(gpg_error_DEPENDENCIES) $(EXTRA_gpg_error_DEPENDENCIES)
@rm -f gpg-error$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gpg_error_OBJECTS) $(gpg_error_LDADD) $(LIBS)
@@ -622,15 +770,21 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpg_error-gpg-error.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpg_error-strerror-sym.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpg_error-strsource-sym.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-b64dec.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-code-from-errno.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-code-to-errno.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-estream-printf.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-estream.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-init.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-posix-lock.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-posix-thread.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-strerror.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-strsource.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-version.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-visibility.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-w32-estream.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-w32-gettext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-w32-iconv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-w32-lock.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgpg_error_la-w32-thread.Plo@am__quote@
@@ -639,14 +793,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -690,6 +844,20 @@ libgpg_error_la-w32-thread.lo: w32-thread.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-w32-thread.lo `test -f 'w32-thread.c' || echo '$(srcdir)/'`w32-thread.c
+libgpg_error_la-w32-iconv.lo: w32-iconv.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-w32-iconv.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-w32-iconv.Tpo -c -o libgpg_error_la-w32-iconv.lo `test -f 'w32-iconv.c' || echo '$(srcdir)/'`w32-iconv.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-w32-iconv.Tpo $(DEPDIR)/libgpg_error_la-w32-iconv.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='w32-iconv.c' object='libgpg_error_la-w32-iconv.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-w32-iconv.lo `test -f 'w32-iconv.c' || echo '$(srcdir)/'`w32-iconv.c
+
+libgpg_error_la-w32-estream.lo: w32-estream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-w32-estream.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-w32-estream.Tpo -c -o libgpg_error_la-w32-estream.lo `test -f 'w32-estream.c' || echo '$(srcdir)/'`w32-estream.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-w32-estream.Tpo $(DEPDIR)/libgpg_error_la-w32-estream.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='w32-estream.c' object='libgpg_error_la-w32-estream.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-w32-estream.lo `test -f 'w32-estream.c' || echo '$(srcdir)/'`w32-estream.c
+
libgpg_error_la-init.lo: init.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-init.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-init.Tpo -c -o libgpg_error_la-init.lo `test -f 'init.c' || echo '$(srcdir)/'`init.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-init.Tpo $(DEPDIR)/libgpg_error_la-init.Plo
@@ -704,6 +872,20 @@ libgpg_error_la-version.lo: version.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c
+libgpg_error_la-estream.lo: estream.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-estream.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-estream.Tpo -c -o libgpg_error_la-estream.lo `test -f 'estream.c' || echo '$(srcdir)/'`estream.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-estream.Tpo $(DEPDIR)/libgpg_error_la-estream.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='estream.c' object='libgpg_error_la-estream.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-estream.lo `test -f 'estream.c' || echo '$(srcdir)/'`estream.c
+
+libgpg_error_la-estream-printf.lo: estream-printf.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-estream-printf.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-estream-printf.Tpo -c -o libgpg_error_la-estream-printf.lo `test -f 'estream-printf.c' || echo '$(srcdir)/'`estream-printf.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-estream-printf.Tpo $(DEPDIR)/libgpg_error_la-estream-printf.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='estream-printf.c' object='libgpg_error_la-estream-printf.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-estream-printf.lo `test -f 'estream-printf.c' || echo '$(srcdir)/'`estream-printf.c
+
libgpg_error_la-strsource.lo: strsource.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-strsource.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-strsource.Tpo -c -o libgpg_error_la-strsource.lo `test -f 'strsource.c' || echo '$(srcdir)/'`strsource.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-strsource.Tpo $(DEPDIR)/libgpg_error_la-strsource.Plo
@@ -732,6 +914,20 @@ libgpg_error_la-code-from-errno.lo: code-from-errno.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-code-from-errno.lo `test -f 'code-from-errno.c' || echo '$(srcdir)/'`code-from-errno.c
+libgpg_error_la-visibility.lo: visibility.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-visibility.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-visibility.Tpo -c -o libgpg_error_la-visibility.lo `test -f 'visibility.c' || echo '$(srcdir)/'`visibility.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-visibility.Tpo $(DEPDIR)/libgpg_error_la-visibility.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='visibility.c' object='libgpg_error_la-visibility.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-visibility.lo `test -f 'visibility.c' || echo '$(srcdir)/'`visibility.c
+
+libgpg_error_la-b64dec.lo: b64dec.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libgpg_error_la-b64dec.lo -MD -MP -MF $(DEPDIR)/libgpg_error_la-b64dec.Tpo -c -o libgpg_error_la-b64dec.lo `test -f 'b64dec.c' || echo '$(srcdir)/'`b64dec.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgpg_error_la-b64dec.Tpo $(DEPDIR)/libgpg_error_la-b64dec.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='b64dec.c' object='libgpg_error_la-b64dec.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgpg_error_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libgpg_error_la-b64dec.lo `test -f 'b64dec.c' || echo '$(srcdir)/'`b64dec.c
+
gpg_error-strsource-sym.o: strsource-sym.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpg_error_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpg_error-strsource-sym.o -MD -MP -MF $(DEPDIR)/gpg_error-strsource-sym.Tpo -c -o gpg_error-strsource-sym.o `test -f 'strsource-sym.c' || echo '$(srcdir)/'`strsource-sym.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpg_error-strsource-sym.Tpo $(DEPDIR)/gpg_error-strsource-sym.Po
@@ -800,9 +996,9 @@ uninstall-m4dataDATA:
@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir)
-install-includeHEADERS: $(include_HEADERS)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
@$(NORMAL_INSTALL)
- @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
$(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
@@ -816,32 +1012,21 @@ install-includeHEADERS: $(include_HEADERS)
$(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
done
-uninstall-includeHEADERS:
+uninstall-nodist_includeHEADERS:
@$(NORMAL_UNINSTALL)
- @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -853,15 +1038,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -870,6 +1051,21 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -971,8 +1167,8 @@ info: info-am
info-am:
-install-data-am: install-data-local install-includeHEADERS \
- install-m4dataDATA
+install-data-am: install-data-local install-m4dataDATA \
+ install-nodist_includeHEADERS
install-dvi: install-dvi-am
@@ -1020,40 +1216,43 @@ ps: ps-am
ps-am:
uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
- uninstall-includeHEADERS uninstall-libLTLIBRARIES \
- uninstall-m4dataDATA
+ uninstall-libLTLIBRARIES uninstall-m4dataDATA \
+ uninstall-nodist_includeHEADERS
.MAKE: all check install install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libLTLIBRARIES clean-libtool \
- clean-noinstPROGRAMS ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-binPROGRAMS install-binSCRIPTS install-data \
- install-data-am install-data-local install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-includeHEADERS install-info install-info-am \
- install-libLTLIBRARIES install-m4dataDATA install-man \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-binPROGRAMS uninstall-binSCRIPTS \
- uninstall-includeHEADERS uninstall-libLTLIBRARIES \
- uninstall-m4dataDATA
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-binSCRIPTS install-data install-data-am \
+ install-data-local install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-libLTLIBRARIES install-m4dataDATA \
+ install-man install-nodist_includeHEADERS install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-binSCRIPTS uninstall-libLTLIBRARIES \
+ uninstall-m4dataDATA uninstall-nodist_includeHEADERS
@HAVE_W32_SYSTEM_TRUE@.rc.lo:
@HAVE_W32_SYSTEM_TRUE@ $(LTRCCOMPILE) -i "$<" -o "$@"
+@HAVE_W32_SYSTEM_TRUE@versioninfo.lo : gpg-error.w32-manifest
+
@HAVE_W32_SYSTEM_TRUE@install-def-file: gpg-error.def
@HAVE_W32_SYSTEM_TRUE@ -$(INSTALL) -d $(DESTDIR)$(libdir)
@HAVE_W32_SYSTEM_TRUE@ $(INSTALL) gpg-error.def $(DESTDIR)$(libdir)/gpg-error.def
@HAVE_W32_SYSTEM_TRUE@uninstall-def-file:
@HAVE_W32_SYSTEM_TRUE@ -rm $(DESTDIR)$(libdir)/gpg-error.def
+
@HAVE_W32_SYSTEM_FALSE@install-def-file:
@HAVE_W32_SYSTEM_FALSE@uninstall-def-file:
@@ -1084,7 +1283,7 @@ code-to-errno.h: Makefile mkerrnos.awk errnos.in
# It is correct to use $(CPP). We want the host's idea of the error codes.
mkerrcodes.h: Makefile mkerrcodes.awk $(gpg_extra_headers)
$(AWK) -f $(srcdir)/mkerrcodes1.awk $(srcdir)/errnos.in >_$@
- $(CPP) $(CPPFLAGS) $(extra_cppflags) _$@ | grep GPG_ERR_ | \
+ $(CPP) $(CPPFLAGS) $(extra_cppflags) -P _$@ | grep GPG_ERR_ | \
$(AWK) -f $(srcdir)/mkerrcodes.awk >$@
-rm _$@
@@ -1129,15 +1328,19 @@ errnos-sym.h: Makefile mkstrtable.awk errnos.in
mkheader: mkheader.c Makefile
$(CC_FOR_BUILD) -g -O0 -I. -I$(srcdir) -o $@ $(srcdir)/mkheader.c
-@CROSS_COMPILING_FALSE@lock-obj-pub.native.h: Makefile gen-posix-lock-obj posix-lock-obj.h
-@CROSS_COMPILING_FALSE@ ./gen-posix-lock-obj >$@
+@FORCE_USE_SYSCFG_FALSE@./lock-obj-pub.native.h: Makefile gen-posix-lock-obj$(EXEEXT) posix-lock-obj.h
+@FORCE_USE_SYSCFG_FALSE@ ./gen-posix-lock-obj >$@
# We also depend on versioninfo.rc because that is build by
# config.status and thus has up-to-date version numbers.
-gpg-error.h: Makefile mkheader $(parts_of_gpg_error_h) versioninfo.rc
+gpg-error.h: Makefile mkheader $(parts_of_gpg_error_h) \
+ versioninfo.rc ../config.h
$(pre_mkheader_cmds)
./mkheader $(host_os) $(host_triplet) $(srcdir)/gpg-error.h.in \
- $(PACKAGE_VERSION) $(VERSION_NUMBER) >$@
+ ../config.h $(PACKAGE_VERSION) $(VERSION_NUMBER) >$@
+
+gpgrt.h: gpg-error.h
+ cp gpg-error.h gpgrt.h
install-data-local:
@HAVE_W32CE_SYSTEM_TRUE@ -$(MKDIR_P) "$(DESTDIR)$(includedir)/gpg-extra"
diff --git a/src/b64dec.c b/src/b64dec.c
new file mode 100644
index 0000000..d846a6a
--- /dev/null
+++ b/src/b64dec.c
@@ -0,0 +1,279 @@
+/* b64dec.c - Simple Base64 decoder.
+ * Copyright (C) 2008, 2011 Free Software Foundation, Inc.
+ * Copyright (C) 2008, 2011, 2016 g10 Code GmbH
+ *
+ * This file is part of GnuPG.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "gpgrt-int.h"
+
+struct _gpgrt_b64state
+{
+ int idx;
+ int quad_count;
+ char *title;
+ unsigned char radbuf[4];
+ int stop_seen:1;
+ int invalid_encoding:1;
+ gpg_error_t lasterr;
+};
+
+/* The reverse base-64 list used for base-64 decoding. */
+static unsigned char const asctobin[128] =
+ {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
+ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
+ 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
+ 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
+ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
+ 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff
+ };
+
+enum decoder_states
+ {
+ s_init, s_idle, s_lfseen, s_beginseen, s_waitheader, s_waitblank, s_begin,
+ s_b64_0, s_b64_1, s_b64_2, s_b64_3,
+ s_waitendtitle, s_waitend
+ };
+
+
+
+/* Allocate and initialize the context for the base64 decoder. If
+ TITLE is NULL a plain base64 decoding is done. If it is the empty
+ string the decoder will skip everything until a "-----BEGIN " line
+ has been seen, decoding ends at a "----END " line. */
+gpgrt_b64state_t
+_gpgrt_b64dec_start (const char *title)
+{
+ gpgrt_b64state_t state;
+ char *t = NULL;
+
+ if (title)
+ {
+ t = strdup (title);
+ if (!t)
+ return NULL;
+ }
+
+ state = calloc (1, sizeof (struct _gpgrt_b64state));
+ if (!state)
+ {
+ free (t);
+ return NULL;
+ }
+
+ if (t)
+ {
+ state->title = t;
+ state->idx = s_init;
+ }
+ else
+ state->idx = s_b64_0;
+
+ return state;
+}
+
+
+/* Do in-place decoding of base-64 data of LENGTH in BUFFER. Stores the
+ new length of the buffer at R_NBYTES. */
+gpg_error_t
+_gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer, size_t length,
+ size_t *r_nbytes)
+{
+ enum decoder_states ds = state->idx;
+ unsigned char val = state->radbuf[0];
+ int pos = state->quad_count;
+ char *d, *s;
+
+ if (state->lasterr)
+ return state->lasterr;
+
+ if (state->stop_seen)
+ {
+ *r_nbytes = 0;
+ state->lasterr = gpg_error (GPG_ERR_EOF);
+ free (state->title);
+ state->title = NULL;
+ return state->lasterr;
+ }
+
+ for (s=d=buffer; length && !state->stop_seen; length--, s++)
+ {
+ again:
+ switch (ds)
+ {
+ case s_idle:
+ if (*s == '\n')
+ {
+ ds = s_lfseen;
+ pos = 0;
+ }
+ break;
+ case s_init:
+ ds = s_lfseen;
+ case s_lfseen:
+ if (*s != "-----BEGIN "[pos])
+ {
+ ds = s_idle;
+ goto again;
+ }
+ else if (pos == 10)
+ {
+ pos = 0;
+ ds = s_beginseen;
+ }
+ else
+ pos++;
+ break;
+ case s_beginseen:
+ if (*s != "PGP "[pos])
+ ds = s_begin; /* Not a PGP armor. */
+ else if (pos == 3)
+ ds = s_waitheader;
+ else
+ pos++;
+ break;
+ case s_waitheader:
+ if (*s == '\n')
+ ds = s_waitblank;
+ break;
+ case s_waitblank:
+ if (*s == '\n')
+ ds = s_b64_0; /* blank line found. */
+ else if (*s == ' ' || *s == '\r' || *s == '\t')
+ ; /* Ignore spaces. */
+ else
+ {
+ /* Armor header line. Note that we don't care that our
+ * FSM accepts a header prefixed with spaces. */
+ ds = s_waitheader; /* Wait for next header. */
+ }
+ break;
+ case s_begin:
+ if (*s == '\n')
+ ds = s_b64_0;
+ break;
+ case s_b64_0:
+ case s_b64_1:
+ case s_b64_2:
+ case s_b64_3:
+ {
+ int c;
+
+ if (*s == '-' && state->title)
+ {
+ /* Not a valid Base64 character: assume end
+ header. */
+ ds = s_waitend;
+ }
+ else if (*s == '=')
+ {
+ /* Pad character: stop */
+ if (ds == s_b64_1)
+ *d++ = val;
+ ds = state->title? s_waitendtitle : s_waitend;
+ }
+ else if (*s == '\n' || *s == ' ' || *s == '\r' || *s == '\t')
+ ; /* Skip white spaces. */
+ else if ( (*s & 0x80)
+ || (c = asctobin[*(unsigned char *)s]) == 255)
+ {
+ /* Skip invalid encodings. */
+ state->invalid_encoding = 1;
+ }
+ else if (ds == s_b64_0)
+ {
+ val = c << 2;
+ ds = s_b64_1;
+ }
+ else if (ds == s_b64_1)
+ {
+ val |= (c>>4)&3;
+ *d++ = val;
+ val = (c<<4)&0xf0;
+ ds = s_b64_2;
+ }
+ else if (ds == s_b64_2)
+ {
+ val |= (c>>2)&15;
+ *d++ = val;
+ val = (c<<6)&0xc0;
+ ds = s_b64_3;
+ }
+ else
+ {
+ val |= c&0x3f;
+ *d++ = val;
+ ds = s_b64_0;
+ }
+ }
+ break;
+ case s_waitendtitle:
+ if (*s == '-')
+ ds = s_waitend;
+ break;
+ case s_waitend:
+ if ( *s == '\n')
+ state->stop_seen = 1;
+ break;
+ default:
+ assert (!"invalid state");
+ }
+ }
+
+
+ state->idx = ds;
+ state->radbuf[0] = val;
+ state->quad_count = pos;
+ *r_nbytes = (d -(char*) buffer);
+ return 0;
+}
+
+
+/* Return an error code in case an encoding error has been found
+ during decoding. */
+gpg_error_t
+_gpgrt_b64dec_finish (gpgrt_b64state_t state)
+{
+ gpg_error_t err;
+
+ if (state->lasterr)
+ err = state->lasterr;
+ else
+ {
+ free (state->title);
+ err = state->invalid_encoding? gpg_error(GPG_ERR_BAD_DATA): 0;
+ }
+ free (state);
+
+ return err;
+}
diff --git a/src/code-from-errno.c b/src/code-from-errno.c
index 96fcf20..6064270 100644
--- a/src/code-from-errno.c
+++ b/src/code-from-errno.c
@@ -7,12 +7,12 @@
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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpg-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -22,7 +22,7 @@
#include <config.h>
#endif
-#include <errno.h>
+#include <errno.h>
#include <gpg-error.h>
@@ -32,7 +32,7 @@
GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped (report
this). */
gpg_err_code_t
-gpg_err_code_from_errno (int err)
+_gpg_err_code_from_errno (int err)
{
int idx;
@@ -52,7 +52,7 @@ gpg_err_code_from_errno (int err)
returns GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped
(report this) and GPG_ERR_MISSING_ERRNO if ERRNO has the value 0. */
gpg_err_code_t
-gpg_err_code_from_syserror (void)
+_gpg_err_code_from_syserror (void)
{
int err = errno;
int idx;
diff --git a/src/code-to-errno.c b/src/code-to-errno.c
index 5873aad..6ba6d87 100644
--- a/src/code-to-errno.c
+++ b/src/code-to-errno.c
@@ -7,12 +7,12 @@
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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpg-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -29,7 +29,7 @@
/* Retrieve the system error for the error code CODE. This returns 0
if CODE is not a system error code. */
int
-gpg_err_code_to_errno (gpg_err_code_t code)
+_gpg_err_code_to_errno (gpg_err_code_t code)
{
if (!(code & GPG_ERR_SYSTEM_ERROR))
return 0;
diff --git a/src/err-codes.h b/src/err-codes.h
index a564876..5249b08 100644
--- a/src/err-codes.h
+++ b/src/err-codes.h
@@ -38,7 +38,7 @@ static const char msgstr[] =
gettext_noop ("Checksum error") "\0"
gettext_noop ("Bad passphrase") "\0"
gettext_noop ("Invalid cipher algorithm") "\0"
- gettext_noop ("Keyring open") "\0"
+ gettext_noop ("Cannot open keyring") "\0"
gettext_noop ("Invalid packet") "\0"
gettext_noop ("Invalid armor") "\0"
gettext_noop ("No user ID") "\0"
@@ -239,8 +239,46 @@ static const char msgstr[] =
gettext_noop ("Bad hexadecimal character in S-expression") "\0"
gettext_noop ("Odd hexadecimal numbers in S-expression") "\0"
gettext_noop ("Bad octal character in S-expression") "\0"
+ gettext_noop ("All subkeys are expired or revoked") "\0"
+ gettext_noop ("Database is corrupted") "\0"
+ gettext_noop ("Server indicated a failure") "\0"
+ gettext_noop ("No name") "\0"
+ gettext_noop ("No key") "\0"
+ gettext_noop ("Legacy key") "\0"
+ gettext_noop ("Request too short") "\0"
+ gettext_noop ("Request too long") "\0"
+ gettext_noop ("Object is in termination state") "\0"
+ gettext_noop ("No certificate chain") "\0"
+ gettext_noop ("Certificate is too large") "\0"
+ gettext_noop ("Invalid record") "\0"
+ gettext_noop ("The MAC does not verify") "\0"
+ gettext_noop ("Unexpected message") "\0"
+ gettext_noop ("Compression or decompression failed") "\0"
+ gettext_noop ("A counter would wrap") "\0"
+ gettext_noop ("Fatal alert message received") "\0"
+ gettext_noop ("No cipher algorithm") "\0"
+ gettext_noop ("Missing client certificate") "\0"
+ gettext_noop ("Close notification received") "\0"
+ gettext_noop ("Ticket expired") "\0"
+ gettext_noop ("Bad ticket") "\0"
+ gettext_noop ("Unknown identity") "\0"
+ gettext_noop ("Bad certificate message in handshake") "\0"
+ gettext_noop ("Bad certificate request message in handshake") "\0"
+ gettext_noop ("Bad certificate verify message in handshake") "\0"
+ gettext_noop ("Bad change cipher message in handshake") "\0"
+ gettext_noop ("Bad client hello message in handshake") "\0"
+ gettext_noop ("Bad server hello message in handshake") "\0"
+ gettext_noop ("Bad server hello done message in handshake") "\0"
+ gettext_noop ("Bad finished message in handshake") "\0"
+ gettext_noop ("Bad server key exchange message in handshake") "\0"
+ gettext_noop ("Bad client key exchange message in handshake") "\0"
+ gettext_noop ("Bogus string") "\0"
+ gettext_noop ("Forbidden") "\0"
+ gettext_noop ("Key disabled") "\0"
gettext_noop ("Not possible with a card based key") "\0"
gettext_noop ("Invalid lock object") "\0"
+ gettext_noop ("True") "\0"
+ gettext_noop ("False") "\0"
gettext_noop ("General IPC error") "\0"
gettext_noop ("IPC accept call failed") "\0"
gettext_noop ("IPC connect call failed") "\0"
@@ -265,6 +303,110 @@ static const char msgstr[] =
gettext_noop ("No output source for IPC") "\0"
gettext_noop ("IPC parameter error") "\0"
gettext_noop ("Unknown IPC inquire") "\0"
+ gettext_noop ("Crypto engine too old") "\0"
+ gettext_noop ("Screen or window too small") "\0"
+ gettext_noop ("Screen or window too large") "\0"
+ gettext_noop ("Required environment variable not set") "\0"
+ gettext_noop ("User ID already exists") "\0"
+ gettext_noop ("Name already exists") "\0"
+ gettext_noop ("Duplicated name") "\0"
+ gettext_noop ("Object is too young") "\0"
+ gettext_noop ("Object is too old") "\0"
+ gettext_noop ("Unknown flag") "\0"
+ gettext_noop ("Invalid execution order") "\0"
+ gettext_noop ("Already fetched") "\0"
+ gettext_noop ("Try again later") "\0"
+ gettext_noop ("Wrong name") "\0"
+ gettext_noop ("System bug detected") "\0"
+ gettext_noop ("Unknown DNS error") "\0"
+ gettext_noop ("Invalid DNS section") "\0"
+ gettext_noop ("Invalid textual address form") "\0"
+ gettext_noop ("Missing DNS query packet") "\0"
+ gettext_noop ("Missing DNS answer packet") "\0"
+ gettext_noop ("Connection closed in DNS") "\0"
+ gettext_noop ("Verification failed in DNS") "\0"
+ gettext_noop ("DNS Timeout") "\0"
+ gettext_noop ("General LDAP error") "\0"
+ gettext_noop ("General LDAP attribute error") "\0"
+ gettext_noop ("General LDAP name error") "\0"
+ gettext_noop ("General LDAP security error") "\0"
+ gettext_noop ("General LDAP service error") "\0"
+ gettext_noop ("General LDAP update error") "\0"
+ gettext_noop ("Experimental LDAP error code") "\0"
+ gettext_noop ("Private LDAP error code") "\0"
+ gettext_noop ("Other general LDAP error") "\0"
+ gettext_noop ("LDAP connecting failed (X)") "\0"
+ gettext_noop ("LDAP referral limit exceeded") "\0"
+ gettext_noop ("LDAP client loop") "\0"
+ gettext_noop ("No LDAP results returned") "\0"
+ gettext_noop ("LDAP control not found") "\0"
+ gettext_noop ("Not supported by LDAP") "\0"
+ gettext_noop ("LDAP connect error") "\0"
+ gettext_noop ("Out of memory in LDAP") "\0"
+ gettext_noop ("Bad parameter to an LDAP routine") "\0"
+ gettext_noop ("User cancelled LDAP operation") "\0"
+ gettext_noop ("Bad LDAP search filter") "\0"
+ gettext_noop ("Unknown LDAP authentication method") "\0"
+ gettext_noop ("Timeout in LDAP") "\0"
+ gettext_noop ("LDAP decoding error") "\0"
+ gettext_noop ("LDAP encoding error") "\0"
+ gettext_noop ("LDAP local error") "\0"
+ gettext_noop ("Cannot contact LDAP server") "\0"
+ gettext_noop ("LDAP success") "\0"
+ gettext_noop ("LDAP operations error") "\0"
+ gettext_noop ("LDAP protocol error") "\0"
+ gettext_noop ("Time limit exceeded in LDAP") "\0"
+ gettext_noop ("Size limit exceeded in LDAP") "\0"
+ gettext_noop ("LDAP compare false") "\0"
+ gettext_noop ("LDAP compare true") "\0"
+ gettext_noop ("LDAP authentication method not supported") "\0"
+ gettext_noop ("Strong(er) LDAP authentication required") "\0"
+ gettext_noop ("Partial LDAP results+referral received") "\0"
+ gettext_noop ("LDAP referral") "\0"
+ gettext_noop ("Administrative LDAP limit exceeded") "\0"
+ gettext_noop ("Critical LDAP extension is unavailable") "\0"
+ gettext_noop ("Confidentiality required by LDAP") "\0"
+ gettext_noop ("LDAP SASL bind in progress") "\0"
+ gettext_noop ("No such LDAP attribute") "\0"
+ gettext_noop ("Undefined LDAP attribute type") "\0"
+ gettext_noop ("Inappropriate matching in LDAP") "\0"
+ gettext_noop ("Constraint violation in LDAP") "\0"
+ gettext_noop ("LDAP type or value exists") "\0"
+ gettext_noop ("Invalid syntax in LDAP") "\0"
+ gettext_noop ("No such LDAP object") "\0"
+ gettext_noop ("LDAP alias problem") "\0"
+ gettext_noop ("Invalid DN syntax in LDAP") "\0"
+ gettext_noop ("LDAP entry is a leaf") "\0"
+ gettext_noop ("LDAP alias dereferencing problem") "\0"
+ gettext_noop ("LDAP proxy authorization failure (X)") "\0"
+ gettext_noop ("Inappropriate LDAP authentication") "\0"
+ gettext_noop ("Invalid LDAP credentials") "\0"
+ gettext_noop ("Insufficient access for LDAP") "\0"
+ gettext_noop ("LDAP server is busy") "\0"
+ gettext_noop ("LDAP server is unavailable") "\0"
+ gettext_noop ("LDAP server is unwilling to perform") "\0"
+ gettext_noop ("Loop detected by LDAP") "\0"
+ gettext_noop ("LDAP naming violation") "\0"
+ gettext_noop ("LDAP object class violation") "\0"
+ gettext_noop ("LDAP operation not allowed on non-leaf") "\0"
+ gettext_noop ("LDAP operation not allowed on RDN") "\0"
+ gettext_noop ("Already exists (LDAP)") "\0"
+ gettext_noop ("Cannot modify LDAP object class") "\0"
+ gettext_noop ("LDAP results too large") "\0"
+ gettext_noop ("LDAP operation affects multiple DSAs") "\0"
+ gettext_noop ("Virtual LDAP list view error") "\0"
+ gettext_noop ("Other LDAP error") "\0"
+ gettext_noop ("Resources exhausted in LCUP") "\0"
+ gettext_noop ("Security violation in LCUP") "\0"
+ gettext_noop ("Invalid data in LCUP") "\0"
+ gettext_noop ("Unsupported scheme in LCUP") "\0"
+ gettext_noop ("Reload required in LCUP") "\0"
+ gettext_noop ("LDAP cancelled") "\0"
+ gettext_noop ("No LDAP operation to cancel") "\0"
+ gettext_noop ("Too late to cancel LDAP") "\0"
+ gettext_noop ("Cannot cancel LDAP") "\0"
+ gettext_noop ("LDAP assertion failed") "\0"
+ gettext_noop ("Proxied authorization denied by LDAP") "\0"
gettext_noop ("User defined error code 1") "\0"
gettext_noop ("User defined error code 2") "\0"
gettext_noop ("User defined error code 3") "\0"
@@ -302,252 +444,394 @@ static const int msgidx[] =
190,
205,
230,
- 243,
- 258,
- 272,
- 283,
- 297,
- 319,
- 335,
- 365,
- 385,
- 409,
- 435,
- 460,
- 478,
- 487,
- 497,
- 513,
- 526,
- 540,
- 559,
- 583,
- 603,
- 619,
- 634,
- 650,
- 666,
- 683,
- 697,
- 713,
- 740,
- 757,
- 777,
- 796,
- 813,
- 833,
- 845,
- 859,
- 872,
- 888,
- 907,
- 926,
- 946,
- 966,
- 980,
- 1002,
- 1022,
- 1030,
- 1034,
- 1048,
- 1071,
- 1079,
- 1094,
- 1107,
- 1122,
- 1151,
- 1180,
- 1203,
- 1219,
- 1235,
- 1255,
- 1268,
- 1283,
- 1300,
- 1316,
- 1333,
- 1350,
- 1362,
- 1375,
- 1406,
- 1427,
- 1447,
- 1468,
- 1490,
- 1502,
- 1517,
- 1525,
- 1538,
- 1547,
- 1565,
- 1576,
- 1587,
- 1601,
- 1621,
- 1634,
- 1646,
- 1660,
- 1672,
- 1692,
- 1711,
- 1731,
- 1753,
- 1777,
- 1798,
- 1821,
- 1842,
- 1857,
- 1868,
- 1888,
- 1901,
- 1914,
- 1931,
- 1953,
- 1967,
- 1987,
- 2003,
- 2017,
- 2028,
- 2048,
- 2071,
- 2092,
- 2107,
- 2128,
- 2150,
- 2166,
- 2180,
- 2196,
- 2210,
- 2227,
- 2239,
- 2271,
- 2291,
- 2303,
- 2313,
- 2325,
- 2343,
- 2364,
- 2376,
- 2391,
- 2408,
- 2423,
- 2439,
- 2453,
- 2472,
- 2491,
- 2514,
- 2535,
- 2559,
- 2577,
- 2599,
- 2622,
- 2640,
- 2652,
- 2670,
- 2687,
- 2701,
- 2718,
- 2733,
- 2756,
- 2775,
- 2788,
- 2807,
- 2831,
- 2858,
- 2871,
- 2896,
- 2907,
- 2926,
- 2938,
- 2954,
- 2972,
- 2999,
+ 250,
+ 265,
+ 279,
+ 290,
+ 304,
+ 326,
+ 342,
+ 372,
+ 392,
+ 416,
+ 442,
+ 467,
+ 485,
+ 494,
+ 504,
+ 520,
+ 533,
+ 547,
+ 566,
+ 590,
+ 610,
+ 626,
+ 641,
+ 657,
+ 673,
+ 690,
+ 704,
+ 720,
+ 747,
+ 764,
+ 784,
+ 803,
+ 820,
+ 840,
+ 852,
+ 866,
+ 879,
+ 895,
+ 914,
+ 933,
+ 953,
+ 973,
+ 987,
+ 1009,
+ 1029,
+ 1037,
+ 1041,
+ 1055,
+ 1078,
+ 1086,
+ 1101,
+ 1114,
+ 1129,
+ 1158,
+ 1187,
+ 1210,
+ 1226,
+ 1242,
+ 1262,
+ 1275,
+ 1290,
+ 1307,
+ 1323,
+ 1340,
+ 1357,
+ 1369,
+ 1382,
+ 1413,
+ 1434,
+ 1454,
+ 1475,
+ 1497,
+ 1509,
+ 1524,
+ 1532,
+ 1545,
+ 1554,
+ 1572,
+ 1583,
+ 1594,
+ 1608,
+ 1628,
+ 1641,
+ 1653,
+ 1667,
+ 1679,
+ 1699,
+ 1718,
+ 1738,
+ 1760,
+ 1784,
+ 1805,
+ 1828,
+ 1849,
+ 1864,
+ 1875,
+ 1895,
+ 1908,
+ 1921,
+ 1938,
+ 1960,
+ 1974,
+ 1994,
+ 2010,
+ 2024,
+ 2035,
+ 2055,
+ 2078,
+ 2099,
+ 2114,
+ 2135,
+ 2157,
+ 2173,
+ 2187,
+ 2203,
+ 2217,
+ 2234,
+ 2246,
+ 2278,
+ 2298,
+ 2310,
+ 2320,
+ 2332,
+ 2350,
+ 2371,
+ 2383,
+ 2398,
+ 2415,
+ 2430,
+ 2446,
+ 2460,
+ 2479,
+ 2498,
+ 2521,
+ 2542,
+ 2566,
+ 2584,
+ 2606,
+ 2629,
+ 2647,
+ 2659,
+ 2677,
+ 2694,
+ 2708,
+ 2725,
+ 2740,
+ 2763,
+ 2782,
+ 2795,
+ 2814,
+ 2838,
+ 2865,
+ 2878,
+ 2903,
+ 2914,
+ 2933,
+ 2945,
+ 2961,
+ 2979,
3006,
- 3021,
- 3037,
- 3053,
- 3073,
- 3086,
- 3098,
- 3115,
- 3127,
- 3144,
- 3158,
- 3174,
- 3201,
- 3224,
- 3247,
- 3270,
- 3285,
- 3302,
- 3320,
- 3341,
- 3360,
- 3391,
- 3409,
- 3427,
- 3449,
- 3475,
- 3502,
- 3519,
- 3560,
- 3592,
- 3630,
- 3657,
- 3687,
- 3717,
- 3745,
- 3782,
- 3806,
- 3854,
- 3896,
- 3936,
- 3972,
- 4007,
- 4027,
- 4045,
- 4068,
- 4092,
- 4113,
- 4141,
- 4171,
- 4199,
- 4219,
- 4243,
- 4270,
- 4288,
- 4306,
- 4334,
- 4349,
+ 3013,
+ 3028,
+ 3044,
+ 3060,
+ 3080,
+ 3093,
+ 3105,
+ 3122,
+ 3134,
+ 3151,
+ 3165,
+ 3181,
+ 3208,
+ 3231,
+ 3254,
+ 3277,
+ 3292,
+ 3309,
+ 3327,
+ 3348,
+ 3367,
+ 3398,
+ 3416,
+ 3434,
+ 3456,
+ 3482,
+ 3509,
+ 3526,
+ 3567,
+ 3599,
+ 3637,
+ 3664,
+ 3694,
+ 3724,
+ 3752,
+ 3789,
+ 3813,
+ 3861,
+ 3903,
+ 3943,
+ 3979,
+ 4014,
+ 4036,
+ 4063,
+ 4071,
+ 4078,
+ 4089,
+ 4107,
+ 4124,
+ 4155,
+ 4176,
+ 4201,
+ 4216,
+ 4240,
+ 4259,
+ 4295,
+ 4316,
+ 4345,
4365,
- 4393,
- 4416,
- 4436,
- 4453,
- 4481,
- 4505,
- 4530,
- 4550,
- 4570,
- 4596,
- 4622,
- 4648,
- 4674,
- 4700,
- 4726,
- 4752,
- 4778,
- 4804,
- 4831,
- 4858,
- 4885,
- 4912,
- 4939,
- 4966,
- 4993,
- 5016,
- 5037,
- 5049
+ 4392,
+ 4420,
+ 4435,
+ 4446,
+ 4463,
+ 4500,
+ 4545,
+ 4589,
+ 4628,
+ 4666,
+ 4704,
+ 4747,
+ 4781,
+ 4826,
+ 4871,
+ 4884,
+ 4894,
+ 4907,
+ 4942,
+ 4962,
+ 4967,
+ 4973,
+ 4991,
+ 5014,
+ 5038,
+ 5059,
+ 5087,
+ 5117,
+ 5145,
+ 5165,
+ 5189,
+ 5216,
+ 5234,
+ 5252,
+ 5280,
+ 5295,
+ 5311,
+ 5339,
+ 5362,
+ 5382,
+ 5399,
+ 5427,
+ 5451,
+ 5476,
+ 5496,
+ 5516,
+ 5538,
+ 5565,
+ 5592,
+ 5630,
+ 5653,
+ 5673,
+ 5689,
+ 5709,
+ 5727,
+ 5740,
+ 5764,
+ 5780,
+ 5796,
+ 5807,
+ 5827,
+ 5845,
+ 5865,
+ 5894,
+ 5919,
+ 5945,
+ 5970,
+ 5997,
+ 6009,
+ 6028,
+ 6057,
+ 6081,
+ 6109,
+ 6136,
+ 6162,
+ 6191,
+ 6215,
+ 6240,
+ 6267,
+ 6296,
+ 6313,
+ 6338,
+ 6361,
+ 6383,
+ 6402,
+ 6424,
+ 6457,
+ 6487,
+ 6510,
+ 6545,
+ 6561,
+ 6581,
+ 6601,
+ 6618,
+ 6645,
+ 6658,
+ 6680,
+ 6700,
+ 6728,
+ 6756,
+ 6775,
+ 6793,
+ 6834,
+ 6874,
+ 6913,
+ 6927,
+ 6962,
+ 7001,
+ 7034,
+ 7061,
+ 7084,
+ 7114,
+ 7145,
+ 7174,
+ 7200,
+ 7223,
+ 7243,
+ 7262,
+ 7288,
+ 7309,
+ 7342,
+ 7379,
+ 7413,
+ 7438,
+ 7467,
+ 7487,
+ 7514,
+ 7550,
+ 7572,
+ 7594,
+ 7622,
+ 7661,
+ 7695,
+ 7717,
+ 7749,
+ 7772,
+ 7809,
+ 7838,
+ 7855,
+ 7883,
+ 7910,
+ 7931,
+ 7958,
+ 7982,
+ 7997,
+ 8025,
+ 8049,
+ 8068,
+ 8090,
+ 8127,
+ 8153,
+ 8179,
+ 8205,
+ 8231,
+ 8257,
+ 8283,
+ 8309,
+ 8335,
+ 8361,
+ 8388,
+ 8415,
+ 8442,
+ 8469,
+ 8496,
+ 8523,
+ 8550,
+ 8573,
+ 8594,
+ 8606
};
static GPG_ERR_INLINE int
@@ -555,10 +839,22 @@ msgidxof (int code)
{
return (0 ? 0
: ((code >= 0) && (code <= 213)) ? (code - 0)
- : ((code >= 253) && (code <= 254)) ? (code - 39)
- : ((code >= 257) && (code <= 271)) ? (code - 41)
- : ((code >= 273) && (code <= 281)) ? (code - 42)
- : ((code >= 1024) && (code <= 1039)) ? (code - 784)
- : ((code >= 16381) && (code <= 16383)) ? (code - 16125)
- : 16384 - 16125);
+ : ((code >= 217) && (code <= 271)) ? (code - 3)
+ : ((code >= 273) && (code <= 281)) ? (code - 4)
+ : ((code >= 300) && (code <= 313)) ? (code - 22)
+ : ((code >= 666) && (code <= 666)) ? (code - 374)
+ : ((code >= 711) && (code <= 718)) ? (code - 418)
+ : ((code >= 721) && (code <= 729)) ? (code - 420)
+ : ((code >= 750) && (code <= 752)) ? (code - 440)
+ : ((code >= 754) && (code <= 782)) ? (code - 441)
+ : ((code >= 784) && (code <= 789)) ? (code - 442)
+ : ((code >= 800) && (code <= 804)) ? (code - 452)
+ : ((code >= 815) && (code <= 822)) ? (code - 462)
+ : ((code >= 832) && (code <= 839)) ? (code - 471)
+ : ((code >= 844) && (code <= 844)) ? (code - 475)
+ : ((code >= 848) && (code <= 848)) ? (code - 478)
+ : ((code >= 881) && (code <= 891)) ? (code - 510)
+ : ((code >= 1024) && (code <= 1039)) ? (code - 642)
+ : ((code >= 16381) && (code <= 16383)) ? (code - 15983)
+ : 16384 - 15983);
}
diff --git a/src/err-codes.h.in b/src/err-codes.h.in
index ee2db2e..2667d71 100644
--- a/src/err-codes.h.in
+++ b/src/err-codes.h.in
@@ -42,7 +42,7 @@
10 GPG_ERR_CHECKSUM Checksum error
11 GPG_ERR_BAD_PASSPHRASE Bad passphrase
12 GPG_ERR_CIPHER_ALGO Invalid cipher algorithm
-13 GPG_ERR_KEYRING_OPEN Keyring open
+13 GPG_ERR_KEYRING_OPEN Cannot open keyring
14 GPG_ERR_INV_PACKET Invalid packet
15 GPG_ERR_INV_ARMOR Invalid armor
16 GPG_ERR_NO_USER_ID No user ID
@@ -247,12 +247,48 @@
212 GPG_ERR_SEXP_ODD_HEX_NUMBERS Odd hexadecimal numbers in S-expression
213 GPG_ERR_SEXP_BAD_OCT_CHAR Bad octal character in S-expression
-# 214 to 252 are free to be used.
-
+# 214 to 216 are free to be used.
+217 GPG_ERR_SUBKEYS_EXP_OR_REV All subkeys are expired or revoked
+218 GPG_ERR_DB_CORRUPTED Database is corrupted
+219 GPG_ERR_SERVER_FAILED Server indicated a failure
+220 GPG_ERR_NO_NAME No name
+221 GPG_ERR_NO_KEY No key
+222 GPG_ERR_LEGACY_KEY Legacy key
+223 GPG_ERR_REQUEST_TOO_SHORT Request too short
+224 GPG_ERR_REQUEST_TOO_LONG Request too long
+225 GPG_ERR_OBJ_TERM_STATE Object is in termination state
+226 GPG_ERR_NO_CERT_CHAIN No certificate chain
+227 GPG_ERR_CERT_TOO_LARGE Certificate is too large
+228 GPG_ERR_INV_RECORD Invalid record
+229 GPG_ERR_BAD_MAC The MAC does not verify
+230 GPG_ERR_UNEXPECTED_MSG Unexpected message
+231 GPG_ERR_COMPR_FAILED Compression or decompression failed
+232 GPG_ERR_WOULD_WRAP A counter would wrap
+233 GPG_ERR_FATAL_ALERT Fatal alert message received
+234 GPG_ERR_NO_CIPHER No cipher algorithm
+235 GPG_ERR_MISSING_CLIENT_CERT Missing client certificate
+236 GPG_ERR_CLOSE_NOTIFY Close notification received
+237 GPG_ERR_TICKET_EXPIRED Ticket expired
+238 GPG_ERR_BAD_TICKET Bad ticket
+239 GPG_ERR_UNKNOWN_IDENTITY Unknown identity
+240 GPG_ERR_BAD_HS_CERT Bad certificate message in handshake
+241 GPG_ERR_BAD_HS_CERT_REQ Bad certificate request message in handshake
+242 GPG_ERR_BAD_HS_CERT_VER Bad certificate verify message in handshake
+243 GPG_ERR_BAD_HS_CHANGE_CIPHER Bad change cipher message in handshake
+244 GPG_ERR_BAD_HS_CLIENT_HELLO Bad client hello message in handshake
+245 GPG_ERR_BAD_HS_SERVER_HELLO Bad server hello message in handshake
+246 GPG_ERR_BAD_HS_SERVER_HELLO_DONE Bad server hello done message in handshake
+247 GPG_ERR_BAD_HS_FINISHED Bad finished message in handshake
+248 GPG_ERR_BAD_HS_SERVER_KEX Bad server key exchange message in handshake
+249 GPG_ERR_BAD_HS_CLIENT_KEX Bad client key exchange message in handshake
+250 GPG_ERR_BOGUS_STRING Bogus string
+251 GPG_ERR_FORBIDDEN Forbidden
+252 GPG_ERR_KEY_DISABLED Key disabled
253 GPG_ERR_KEY_ON_CARD Not possible with a card based key
254 GPG_ERR_INV_LOCK_OBJ Invalid lock object
-# 255 and 256 are RFU.
+255 GPG_ERR_TRUE True
+256 GPG_ERR_FALSE False
# Error codes pertaining to the Assuan IPC interface
257 GPG_ERR_ASS_GENERAL General IPC error
@@ -283,9 +319,138 @@
# 282 to 299 are reserved for future assuan codes.
-# 300 to 1023 are free to be used.
+300 GPG_ERR_ENGINE_TOO_OLD Crypto engine too old
+301 GPG_ERR_WINDOW_TOO_SMALL Screen or window too small
+302 GPG_ERR_WINDOW_TOO_LARGE Screen or window too large
+303 GPG_ERR_MISSING_ENVVAR Required environment variable not set
+304 GPG_ERR_USER_ID_EXISTS User ID already exists
+305 GPG_ERR_NAME_EXISTS Name already exists
+306 GPG_ERR_DUP_NAME Duplicated name
+307 GPG_ERR_TOO_YOUNG Object is too young
+308 GPG_ERR_TOO_OLD Object is too old
+309 GPG_ERR_UNKNOWN_FLAG Unknown flag
+310 GPG_ERR_INV_ORDER Invalid execution order
+311 GPG_ERR_ALREADY_FETCHED Already fetched
+312 GPG_ERR_TRY_LATER Try again later
+313 GPG_ERR_WRONG_NAME Wrong name
+# This range is free for use.
+
+666 GPG_ERR_SYSTEM_BUG System bug detected
+
+#
+# Mapping of some error codes from libdns and other DNS specific error codes
+#
+711 GPG_ERR_DNS_UNKNOWN Unknown DNS error
+712 GPG_ERR_DNS_SECTION Invalid DNS section
+713 GPG_ERR_DNS_ADDRESS Invalid textual address form
+714 GPG_ERR_DNS_NO_QUERY Missing DNS query packet
+715 GPG_ERR_DNS_NO_ANSWER Missing DNS answer packet
+716 GPG_ERR_DNS_CLOSED Connection closed in DNS
+717 GPG_ERR_DNS_VERIFY Verification failed in DNS
+718 GPG_ERR_DNS_TIMEOUT DNS Timeout
+
+#
+# Mapping of LDAP error codes
+#
+# The numbers reflect the OpenLDAP code with an offset of 768.
+# Some error names are shortened
+#
+721 GPG_ERR_LDAP_GENERAL General LDAP error
+722 GPG_ERR_LDAP_ATTR_GENERAL General LDAP attribute error
+723 GPG_ERR_LDAP_NAME_GENERAL General LDAP name error
+724 GPG_ERR_LDAP_SECURITY_GENERAL General LDAP security error
+725 GPG_ERR_LDAP_SERVICE_GENERAL General LDAP service error
+726 GPG_ERR_LDAP_UPDATE_GENERAL General LDAP update error
+727 GPG_ERR_LDAP_E_GENERAL Experimental LDAP error code
+728 GPG_ERR_LDAP_X_GENERAL Private LDAP error code
+729 GPG_ERR_LDAP_OTHER_GENERAL Other general LDAP error
+# 730 to 749 not used
+750 GPG_ERR_LDAP_X_CONNECTING LDAP connecting failed (X)
+751 GPG_ERR_LDAP_REFERRAL_LIMIT LDAP referral limit exceeded
+752 GPG_ERR_LDAP_CLIENT_LOOP LDAP client loop
+# 753 is an obsolete error code
+754 GPG_ERR_LDAP_NO_RESULTS No LDAP results returned
+755 GPG_ERR_LDAP_CONTROL_NOT_FOUND LDAP control not found
+756 GPG_ERR_LDAP_NOT_SUPPORTED Not supported by LDAP
+757 GPG_ERR_LDAP_CONNECT LDAP connect error
+758 GPG_ERR_LDAP_NO_MEMORY Out of memory in LDAP
+759 GPG_ERR_LDAP_PARAM Bad parameter to an LDAP routine
+760 GPG_ERR_LDAP_USER_CANCELLED User cancelled LDAP operation
+761 GPG_ERR_LDAP_FILTER Bad LDAP search filter
+762 GPG_ERR_LDAP_AUTH_UNKNOWN Unknown LDAP authentication method
+763 GPG_ERR_LDAP_TIMEOUT Timeout in LDAP
+764 GPG_ERR_LDAP_DECODING LDAP decoding error
+765 GPG_ERR_LDAP_ENCODING LDAP encoding error
+766 GPG_ERR_LDAP_LOCAL LDAP local error
+767 GPG_ERR_LDAP_SERVER_DOWN Cannot contact LDAP server
+768 GPG_ERR_LDAP_SUCCESS LDAP success
+769 GPG_ERR_LDAP_OPERATIONS LDAP operations error
+770 GPG_ERR_LDAP_PROTOCOL LDAP protocol error
+771 GPG_ERR_LDAP_TIMELIMIT Time limit exceeded in LDAP
+772 GPG_ERR_LDAP_SIZELIMIT Size limit exceeded in LDAP
+773 GPG_ERR_LDAP_COMPARE_FALSE LDAP compare false
+774 GPG_ERR_LDAP_COMPARE_TRUE LDAP compare true
+775 GPG_ERR_LDAP_UNSUPPORTED_AUTH LDAP authentication method not supported
+776 GPG_ERR_LDAP_STRONG_AUTH_RQRD Strong(er) LDAP authentication required
+777 GPG_ERR_LDAP_PARTIAL_RESULTS Partial LDAP results+referral received
+778 GPG_ERR_LDAP_REFERRAL LDAP referral
+779 GPG_ERR_LDAP_ADMINLIMIT Administrative LDAP limit exceeded
+780 GPG_ERR_LDAP_UNAVAIL_CRIT_EXTN Critical LDAP extension is unavailable
+781 GPG_ERR_LDAP_CONFIDENT_RQRD Confidentiality required by LDAP
+782 GPG_ERR_LDAP_SASL_BIND_INPROG LDAP SASL bind in progress
+# 783 not used
+784 GPG_ERR_LDAP_NO_SUCH_ATTRIBUTE No such LDAP attribute
+785 GPG_ERR_LDAP_UNDEFINED_TYPE Undefined LDAP attribute type
+786 GPG_ERR_LDAP_BAD_MATCHING Inappropriate matching in LDAP
+787 GPG_ERR_LDAP_CONST_VIOLATION Constraint violation in LDAP
+788 GPG_ERR_LDAP_TYPE_VALUE_EXISTS LDAP type or value exists
+789 GPG_ERR_LDAP_INV_SYNTAX Invalid syntax in LDAP
+# 790 to 799 not used
+800 GPG_ERR_LDAP_NO_SUCH_OBJ No such LDAP object
+801 GPG_ERR_LDAP_ALIAS_PROBLEM LDAP alias problem
+802 GPG_ERR_LDAP_INV_DN_SYNTAX Invalid DN syntax in LDAP
+803 GPG_ERR_LDAP_IS_LEAF LDAP entry is a leaf
+804 GPG_ERR_LDAP_ALIAS_DEREF LDAP alias dereferencing problem
+# 805 to 814 not used
+815 GPG_ERR_LDAP_X_PROXY_AUTH_FAIL LDAP proxy authorization failure (X)
+816 GPG_ERR_LDAP_BAD_AUTH Inappropriate LDAP authentication
+817 GPG_ERR_LDAP_INV_CREDENTIALS Invalid LDAP credentials
+818 GPG_ERR_LDAP_INSUFFICIENT_ACC Insufficient access for LDAP
+819 GPG_ERR_LDAP_BUSY LDAP server is busy
+820 GPG_ERR_LDAP_UNAVAILABLE LDAP server is unavailable
+821 GPG_ERR_LDAP_UNWILL_TO_PERFORM LDAP server is unwilling to perform
+822 GPG_ERR_LDAP_LOOP_DETECT Loop detected by LDAP
+# 823 to 831 not used
+832 GPG_ERR_LDAP_NAMING_VIOLATION LDAP naming violation
+833 GPG_ERR_LDAP_OBJ_CLS_VIOLATION LDAP object class violation
+834 GPG_ERR_LDAP_NOT_ALLOW_NONLEAF LDAP operation not allowed on non-leaf
+835 GPG_ERR_LDAP_NOT_ALLOW_ON_RDN LDAP operation not allowed on RDN
+836 GPG_ERR_LDAP_ALREADY_EXISTS Already exists (LDAP)
+837 GPG_ERR_LDAP_NO_OBJ_CLASS_MODS Cannot modify LDAP object class
+838 GPG_ERR_LDAP_RESULTS_TOO_LARGE LDAP results too large
+839 GPG_ERR_LDAP_AFFECTS_MULT_DSAS LDAP operation affects multiple DSAs
+# 840 to 843 not used
+844 GPG_ERR_LDAP_VLV Virtual LDAP list view error
+# 845 to 847 not used
+848 GPG_ERR_LDAP_OTHER Other LDAP error
+# 849 to 880 not used
+881 GPG_ERR_LDAP_CUP_RESOURCE_LIMIT Resources exhausted in LCUP
+882 GPG_ERR_LDAP_CUP_SEC_VIOLATION Security violation in LCUP
+883 GPG_ERR_LDAP_CUP_INV_DATA Invalid data in LCUP
+884 GPG_ERR_LDAP_CUP_UNSUP_SCHEME Unsupported scheme in LCUP
+885 GPG_ERR_LDAP_CUP_RELOAD Reload required in LCUP
+886 GPG_ERR_LDAP_CANCELLED LDAP cancelled
+887 GPG_ERR_LDAP_NO_SUCH_OPERATION No LDAP operation to cancel
+888 GPG_ERR_LDAP_TOO_LATE Too late to cancel LDAP
+889 GPG_ERR_LDAP_CANNOT_CANCEL Cannot cancel LDAP
+890 GPG_ERR_LDAP_ASSERTION_FAILED LDAP assertion failed
+891 GPG_ERR_LDAP_PROX_AUTH_DENIED Proxied authorization denied by LDAP
+
+# 892 to 950 are reserved for future LDAP codes.
+
+# 951 to 1023 are free to be used.
-# For free use by non-GnuPG components.
+# For free use by non-GnuPG components:
1024 GPG_ERR_USER_1 User defined error code 1
1025 GPG_ERR_USER_2 User defined error code 2
1026 GPG_ERR_USER_3 User defined error code 3
diff --git a/src/err-sources.h b/src/err-sources.h
index e16e459..5160fd7 100644
--- a/src/err-sources.h
+++ b/src/err-sources.h
@@ -41,6 +41,7 @@ static const char msgstr[] =
gettext_noop ("Kleopatra") "\0"
gettext_noop ("G13") "\0"
gettext_noop ("Assuan") "\0"
+ gettext_noop ("TLS") "\0"
gettext_noop ("Any source") "\0"
gettext_noop ("User defined source 1") "\0"
gettext_noop ("User defined source 2") "\0"
@@ -67,11 +68,12 @@ static const int msgidx[] =
106,
110,
117,
- 128,
- 150,
- 172,
- 194,
- 216
+ 121,
+ 132,
+ 154,
+ 176,
+ 198,
+ 220
};
static GPG_ERR_INLINE int
@@ -79,6 +81,7 @@ msgidxof (int code)
{
return (0 ? 0
: ((code >= 0) && (code <= 15)) ? (code - 0)
- : ((code >= 31) && (code <= 35)) ? (code - 15)
- : 36 - 15);
+ : ((code >= 17) && (code <= 17)) ? (code - 1)
+ : ((code >= 31) && (code <= 35)) ? (code - 14)
+ : 36 - 14);
}
diff --git a/src/err-sources.h.in b/src/err-sources.h.in
index 34c1817..13ca454 100644
--- a/src/err-sources.h.in
+++ b/src/err-sources.h.in
@@ -46,6 +46,8 @@
14 GPG_ERR_SOURCE_G13 G13
15 GPG_ERR_SOURCE_ASSUAN Assuan
+17 GPG_ERR_SOURCE_TLS TLS
+
# 15 to 30 are free to be used.
31 GPG_ERR_SOURCE_ANY Any source
diff --git a/src/estream-printf.c b/src/estream-printf.c
new file mode 100644
index 0000000..f1cbcde
--- /dev/null
+++ b/src/estream-printf.c
@@ -0,0 +1,1875 @@
+/* estream-printf.c - Versatile mostly C-99 compliant printf formatting
+ * Copyright (C) 2007, 2008, 2009, 2010, 2012, 2014 g10 Code GmbH
+ *
+ * This file is part of Libestream.
+ *
+ * Libestream is free software; you can redistribute it 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.
+ *
+ * Libestream is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libestream; if not, see <https://www.gnu.org/licenses/>.
+ *
+ * ALTERNATIVELY, Libestream may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, and the entire permission notice in its entirety,
+ * including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* Required autoconf tests:
+
+ AC_TYPE_LONG_LONG_INT defines HAVE_LONG_LONG_INT
+ AC_TYPE_LONG_DOUBLE defines HAVE_LONG_DOUBLE
+ AC_TYPE_INTMAX_T defines HAVE_INTMAX_T
+ AC_TYPE_UINTMAX_T defines HAVE_UINTMAX_T
+ AC_CHECK_TYPES([ptrdiff_t]) defines HAVE_PTRDIFF_T
+ AC_CHECK_SIZEOF([unsigned long]) defines SIZEOF_UNSIGNED_LONG
+ AC_CHECK_SIZEOF([void *]) defines SIZEOF_VOID_P
+ HAVE_LANGINFO_THOUSANDS_SEP
+
+ Note that the file estream.m4 provides the autoconf macro
+ ESTREAM_PRINTF_INIT which runs all required checks.
+ See estream-printf.h for ways to tune this code.
+
+ Missing stuff: wchar and wint_t
+ thousands_sep in pr_float.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(_WIN32) && !defined(HAVE_W32_SYSTEM)
+# define HAVE_W32_SYSTEM 1
+# if defined(__MINGW32CE__) && !defined (HAVE_W32CE_SYSTEM)
+# define HAVE_W32CE_SYSTEM
+# endif
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stddef.h>
+#include <assert.h>
+#if defined(HAVE_INTMAX_T) || defined(HAVE_UINTMAX_T)
+# ifdef HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#ifdef HAVE_LANGINFO_THOUSANDS_SEP
+#include <langinfo.h>
+#endif
+#ifdef HAVE_W32CE_SYSTEM
+#include <gpg-error.h> /* ERRNO replacement. */
+#endif
+#ifdef _ESTREAM_PRINTF_EXTRA_INCLUDE
+# include _ESTREAM_PRINTF_EXTRA_INCLUDE
+#endif
+#include "estream-printf.h"
+
+/* #define DEBUG 1 */
+
+
+/* Allow redefinition of asprintf used realloc function. */
+#if defined(_ESTREAM_PRINTF_REALLOC)
+#define my_printf_realloc(a,b) _ESTREAM_PRINTF_REALLOC((a),(b))
+#else
+#define my_printf_realloc(a,b) fixed_realloc((a),(b))
+#endif
+
+/* A wrapper to set ERRNO. */
+#ifdef HAVE_W32CE_SYSTEM
+# define _set_errno(a) gpg_err_set_errno ((a))
+#else
+# define _set_errno(a) do { errno = (a); } while (0)
+#endif
+
+
+/* Calculate array dimension. */
+#ifndef DIM
+#define DIM(array) (sizeof (array) / sizeof (*array))
+#endif
+
+
+/* We allow for that many args without requiring malloced memory. */
+#define DEFAULT_MAX_ARGSPECS 5
+
+/* We allow for that many values without requiring malloced memory. */
+#define DEFAULT_MAX_VALUES 8
+
+/* We allocate this many new array argspec elements each time. */
+#define ARGSPECS_BUMP_VALUE 10
+
+/* Special values for the field width and the precision. */
+#define NO_FIELD_VALUE (-1)
+#define STAR_FIELD_VALUE (-2)
+
+/* Bit valuues used for the conversion flags. */
+#define FLAG_GROUPING 1
+#define FLAG_LEFT_JUST 2
+#define FLAG_PLUS_SIGN 4
+#define FLAG_SPACE_PLUS 8
+#define FLAG_ALT_CONV 16
+#define FLAG_ZERO_PAD 32
+
+/* Constants used the length modifiers. */
+typedef enum
+ {
+ LENMOD_NONE = 0,
+ LENMOD_CHAR, /* "hh" */
+ LENMOD_SHORT, /* "h" */
+ LENMOD_LONG, /* "l" */
+ LENMOD_LONGLONG, /* "ll" */
+ LENMOD_INTMAX, /* "j" */
+ LENMOD_SIZET, /* "z" */
+ LENMOD_PTRDIFF, /* "t" */
+ LENMOD_LONGDBL /* "L" */
+ } lenmod_t;
+
+/* All the conversion specifiers. */
+typedef enum
+ {
+ CONSPEC_UNKNOWN = 0,
+ CONSPEC_DECIMAL,
+ CONSPEC_OCTAL,
+ CONSPEC_UNSIGNED,
+ CONSPEC_HEX,
+ CONSPEC_HEX_UP,
+ CONSPEC_FLOAT,
+ CONSPEC_FLOAT_UP,
+ CONSPEC_EXP,
+ CONSPEC_EXP_UP,
+ CONSPEC_F_OR_G,
+ CONSPEC_F_OR_G_UP,
+ CONSPEC_HEX_EXP,
+ CONSPEC_HEX_EXP_UP,
+ CONSPEC_CHAR,
+ CONSPEC_STRING,
+ CONSPEC_POINTER,
+ CONSPEC_STRERROR,
+ CONSPEC_BYTES_SO_FAR
+ } conspec_t;
+
+
+/* Constants describing all the suppoorted types. Note that we list
+ all the types we know about even if certain types are not available
+ on this system. */
+typedef enum
+ {
+ VALTYPE_UNSUPPORTED = 0, /* Artificial type for error detection. */
+ VALTYPE_CHAR,
+ VALTYPE_SCHAR,
+ VALTYPE_UCHAR,
+ VALTYPE_SHORT,
+ VALTYPE_USHORT,
+ VALTYPE_INT,
+ VALTYPE_UINT,
+ VALTYPE_LONG,
+ VALTYPE_ULONG,
+ VALTYPE_LONGLONG,
+ VALTYPE_ULONGLONG,
+ VALTYPE_DOUBLE,
+ VALTYPE_LONGDOUBLE,
+ VALTYPE_STRING,
+ VALTYPE_INTMAX,
+ VALTYPE_UINTMAX,
+ VALTYPE_SIZE,
+ VALTYPE_PTRDIFF,
+ VALTYPE_POINTER,
+ VALTYPE_CHAR_PTR,
+ VALTYPE_SCHAR_PTR,
+ VALTYPE_SHORT_PTR,
+ VALTYPE_INT_PTR,
+ VALTYPE_LONG_PTR,
+ VALTYPE_LONGLONG_PTR,
+ VALTYPE_INTMAX_PTR,
+ VALTYPE_SIZE_PTR,
+ VALTYPE_PTRDIFF_PTR
+ } valtype_t;
+
+
+/* A union used to store the actual values. */
+typedef union
+{
+ char a_char;
+ 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_long;
+ unsigned long int a_ulong;
+#ifdef HAVE_LONG_LONG_INT
+ long long int a_longlong;
+ unsigned long long int a_ulonglong;
+#endif
+ double a_double;
+#ifdef HAVE_LONG_DOUBLE
+ long double a_longdouble;
+#endif
+ const char *a_string;
+#ifdef HAVE_INTMAX_T
+ intmax_t a_intmax;
+#endif
+#ifdef HAVE_UINTMAX_T
+ intmax_t a_uintmax;
+#endif
+ size_t a_size;
+#ifdef HAVE_PTRDIFF_T
+ ptrdiff_t a_ptrdiff;
+#endif
+ void *a_void_ptr;
+ char *a_char_ptr;
+ signed char *a_schar_ptr;
+ short *a_short_ptr;
+ int *a_int_ptr;
+ long *a_long_ptr;
+#ifdef HAVE_LONG_LONG_INT
+ long long int *a_longlong_ptr;
+#endif
+#ifdef HAVE_INTMAX_T
+ intmax_t *a_intmax_ptr;
+#endif
+ size_t *a_size_ptr;
+#ifdef HAVE_PTRDIFF_T
+ ptrdiff_t *a_ptrdiff_ptr;
+#endif
+} value_t;
+
+/* An object used to keep track of a format option and arguments. */
+struct argspec_s
+{
+ size_t length; /* The length of these args including the percent. */
+ unsigned int flags; /* The conversion flags (bits defined by FLAG_foo). */
+ int width; /* The field width. */
+ int precision; /* The precision. */
+ lenmod_t lenmod; /* The length modifier. */
+ conspec_t conspec; /* The conversion specifier. */
+ int arg_pos; /* The position of the argument. This one may
+ be -1 to indicate that no value is expected
+ (e.g. for "%m"). */
+ int width_pos; /* The position of the argument for a field
+ width star's value. 0 for not used. */
+ int precision_pos; /* The position of the argument for the a
+ precision star's value. 0 for not used. */
+ valtype_t vt; /* The type of the corresponding argument. */
+};
+typedef struct argspec_s *argspec_t;
+
+/* An object to build up a table of values and their types. */
+struct valueitem_s
+{
+ valtype_t vt; /* The type of the value. */
+ value_t value; /* The value. */
+};
+typedef struct valueitem_s *valueitem_t;
+
+
+/* Not all systems have a C-90 compliant realloc. To cope with this
+ we use this simple wrapper. */
+#ifndef _ESTREAM_PRINTF_REALLOC
+static void *
+fixed_realloc (void *a, size_t n)
+{
+ if (!a)
+ return malloc (n);
+
+ if (!n)
+ {
+ free (a);
+ return NULL;
+ }
+
+ return realloc (a, n);
+}
+#endif /*!_ESTREAM_PRINTF_REALLOC*/
+
+
+#ifdef DEBUG
+static void
+dump_argspecs (argspec_t arg, size_t argcount)
+{
+ int idx;
+
+ for (idx=0; argcount; argcount--, arg++, idx++)
+ fprintf (stderr,
+ "%2d: len=%u flags=%u width=%d prec=%d mod=%d "
+ "con=%d vt=%d pos=%d-%d-%d\n",
+ idx,
+ (unsigned int)arg->length,
+ arg->flags,
+ arg->width,
+ arg->precision,
+ arg->lenmod,
+ arg->conspec,
+ arg->vt,
+ arg->arg_pos,
+ arg->width_pos,
+ arg->precision_pos);
+}
+#endif /*DEBUG*/
+
+
+/* Set the vt field for ARG. */
+static void
+compute_type (argspec_t arg)
+{
+ switch (arg->conspec)
+ {
+ case CONSPEC_UNKNOWN:
+ arg->vt = VALTYPE_UNSUPPORTED;
+ break;
+
+ case CONSPEC_DECIMAL:
+ switch (arg->lenmod)
+ {
+ case LENMOD_CHAR: arg->vt = VALTYPE_SCHAR; break;
+ case LENMOD_SHORT: arg->vt = VALTYPE_SHORT; break;
+ case LENMOD_LONG: arg->vt = VALTYPE_LONG; break;
+ case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG; break;
+ case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX; break;
+ case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;
+ case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
+ default: arg->vt = VALTYPE_INT; break;
+ }
+ break;
+
+ case CONSPEC_OCTAL:
+ case CONSPEC_UNSIGNED:
+ case CONSPEC_HEX:
+ case CONSPEC_HEX_UP:
+ switch (arg->lenmod)
+ {
+ case LENMOD_CHAR: arg->vt = VALTYPE_UCHAR; break;
+ case LENMOD_SHORT: arg->vt = VALTYPE_USHORT; break;
+ case LENMOD_LONG: arg->vt = VALTYPE_ULONG; break;
+ case LENMOD_LONGLONG: arg->vt = VALTYPE_ULONGLONG; break;
+ case LENMOD_INTMAX: arg->vt = VALTYPE_UINTMAX; break;
+ case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break;
+ case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break;
+ default: arg->vt = VALTYPE_UINT; break;
+ }
+ break;
+
+ case CONSPEC_FLOAT:
+ case CONSPEC_FLOAT_UP:
+ case CONSPEC_EXP:
+ case CONSPEC_EXP_UP:
+ case CONSPEC_F_OR_G:
+ case CONSPEC_F_OR_G_UP:
+ case CONSPEC_HEX_EXP:
+ case CONSPEC_HEX_EXP_UP:
+ switch (arg->lenmod)
+ {
+ case LENMOD_LONGDBL: arg->vt = VALTYPE_LONGDOUBLE; break;
+ case LENMOD_LONG: arg->vt = VALTYPE_DOUBLE; break;
+ default: arg->vt = VALTYPE_DOUBLE; break;
+ }
+ break;
+
+ case CONSPEC_CHAR:
+ arg->vt = VALTYPE_INT;
+ break;
+
+ case CONSPEC_STRING:
+ arg->vt = VALTYPE_STRING;
+ break;
+
+ case CONSPEC_POINTER:
+ arg->vt = VALTYPE_POINTER;
+ break;
+
+ case CONSPEC_STRERROR:
+ arg->vt = VALTYPE_STRING;
+ break;
+
+ case CONSPEC_BYTES_SO_FAR:
+ switch (arg->lenmod)
+ {
+ case LENMOD_CHAR: arg->vt = VALTYPE_SCHAR_PTR; break;
+ case LENMOD_SHORT: arg->vt = VALTYPE_SHORT_PTR; break;
+ case LENMOD_LONG: arg->vt = VALTYPE_LONG_PTR; break;
+ case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG_PTR; break;
+ case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX_PTR; break;
+ case LENMOD_SIZET: arg->vt = VALTYPE_SIZE_PTR; break;
+ case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF_PTR; break;
+ default: arg->vt = VALTYPE_INT_PTR; break;
+ }
+ break;
+
+ }
+}
+
+
+
+/* Parse the FORMAT string and populate the specification array stored
+ at the address ARGSPECS_ADDR. The caller has provided enough space
+ to store up to MAX_ARGSPECS in that buffer. The function may
+ however ignore the provided buffer and malloc a larger one. On
+ success the address of that larger buffer will be stored at
+ ARGSPECS_ADDR. The actual number of specifications will be
+ returned at R_ARGSPECS_COUNT. */
+static int
+parse_format (const char *format,
+ argspec_t *argspecs_addr, size_t max_argspecs,
+ size_t *r_argspecs_count)
+{
+ const char *s;
+ argspec_t argspecs = *argspecs_addr;
+ argspec_t arg;
+ size_t argcount = 0;
+
+ if (!format)
+ goto leave_einval;
+
+ for (; *format; format++)
+ {
+ unsigned int flags;
+ int width, precision;
+ lenmod_t lenmod;
+ conspec_t conspec;
+ int arg_pos, width_pos, precision_pos;
+
+ if (*format != '%')
+ continue;
+ s = ++format;
+ if (!*s)
+ goto leave_einval;
+ if (*s == '%')
+ continue; /* Just a quoted percent. */
+
+ /* First check whether there is a positional argument. */
+ arg_pos = 0; /* No positional argument given. */
+ if (*s >= '1' && *s <= '9')
+ {
+ const char *save_s = s;
+
+ arg_pos = (*s++ - '0');
+ for (; *s >= '0' && *s <= '9'; s++)
+ arg_pos = 10*arg_pos + (*s - '0');
+ if (arg_pos < 0)
+ goto leave_einval; /* Overflow during conversion. */
+ if (*s == '$')
+ s++;
+ else
+ {
+ arg_pos = 0;
+ s = save_s;
+ }
+ }
+
+ /* Parse the flags. */
+ flags = 0;
+ for ( ; *s; s++)
+ {
+ switch (*s)
+ {
+ case '\'': flags |= FLAG_GROUPING; break;
+ case '-': flags |= FLAG_LEFT_JUST; break;
+ case '+': flags |= FLAG_PLUS_SIGN; break;
+ case ' ': flags |= FLAG_SPACE_PLUS; break;
+ case '#': flags |= FLAG_ALT_CONV; break;
+ case '0': flags |= FLAG_ZERO_PAD; break;
+ default:
+ goto flags_parsed;
+ }
+ }
+ flags_parsed:
+
+ /* Parse the field width. */
+ width_pos = 0;
+ if (*s == '*')
+ {
+ width = STAR_FIELD_VALUE;
+ s++;
+ /* If we have a positional argument, another one might also
+ be used to give the position of the star's value. */
+ if (arg_pos && *s >= '1' && *s <= '9')
+ {
+ width_pos = (*s++ - '0');
+ for (; *s >= '0' && *s <= '9'; s++)
+ width_pos = 10*width_pos + (*s - '0');
+ if (width_pos < 1)
+ goto leave_einval; /* Overflow during conversion. */
+ if (*s != '$')
+ goto leave_einval; /* Not followed by $. */
+ s++;
+ }
+ }
+ else if ( *s >= '0' && *s <= '9')
+ {
+ width = (*s++ - '0');
+ for (; *s >= '0' && *s <= '9'; s++)
+ {
+ if (!width && *s == '0')
+ goto leave_einval; /* Leading zeroes are not allowed.
+ Fixme: check what other
+ implementations do. */
+ width = 10*width + (*s - '0');
+ }
+ if (width < 0)
+ goto leave_einval; /* Overflow during conversion. */
+ }
+ else
+ width = NO_FIELD_VALUE;
+
+ /* Parse the precision. */
+ precision_pos = 0;
+ precision = NO_FIELD_VALUE;
+ if (*s == '.')
+ {
+ int ignore_value = (s[1] == '-');
+
+ s++;
+ if (*s == '*')
+ {
+ precision = STAR_FIELD_VALUE;
+ s++;
+ /* If we have a positional argument, another one might also
+ be used to give the position of the star's value. */
+ if (arg_pos && *s >= '1' && *s <= '9')
+ {
+ precision_pos = (*s++ - '0');
+ for (; *s >= '0' && *s <= '9'; s++)
+ precision_pos = 10*precision_pos + (*s - '0');
+ if (precision_pos < 1)
+ goto leave_einval; /* Overflow during conversion. */
+ if (*s != '$')
+ goto leave_einval; /* Not followed by $. */
+ s++;
+ }
+ }
+ else if ( *s >= '0' && *s <= '9')
+ {
+ precision = (*s++ - '0');
+ for (; *s >= '0' && *s <= '9'; s++)
+ {
+ if (!precision && *s == '0')
+ goto leave_einval; /* Leading zeroes are not allowed.
+ Fixme: check what other
+ implementations do. */
+ precision = 10*precision + (*s - '0');
+ }
+ if (precision < 0)
+ goto leave_einval; /* Overflow during conversion. */
+ }
+ else
+ precision = 0;
+ if (ignore_value)
+ precision = NO_FIELD_VALUE;
+ }
+
+ /* Parse the length modifiers. */
+ switch (*s)
+ {
+ case 'h':
+ if (s[1] == 'h')
+ {
+ lenmod = LENMOD_CHAR;
+ s++;
+ }
+ else
+ lenmod = LENMOD_SHORT;
+ s++;
+ break;
+ case 'l':
+ if (s[1] == 'l')
+ {
+ lenmod = LENMOD_LONGLONG;
+ s++;
+ }
+ else
+ lenmod = LENMOD_LONG;
+ s++;
+ break;
+ case 'j': lenmod = LENMOD_INTMAX; s++; break;
+ case 'z': lenmod = LENMOD_SIZET; s++; break;
+ case 't': lenmod = LENMOD_PTRDIFF; s++; break;
+ case 'L': lenmod = LENMOD_LONGDBL; s++; break;
+ default: lenmod = LENMOD_NONE; break;
+ }
+
+ /* Parse the conversion specifier. */
+ switch (*s)
+ {
+ case 'd':
+ case 'i': conspec = CONSPEC_DECIMAL; break;
+ case 'o': conspec = CONSPEC_OCTAL; break;
+ case 'u': conspec = CONSPEC_UNSIGNED; break;
+ case 'x': conspec = CONSPEC_HEX; break;
+ case 'X': conspec = CONSPEC_HEX_UP; break;
+ case 'f': conspec = CONSPEC_FLOAT; break;
+ case 'F': conspec = CONSPEC_FLOAT_UP; break;
+ case 'e': conspec = CONSPEC_EXP; break;
+ case 'E': conspec = CONSPEC_EXP_UP; break;
+ case 'g': conspec = CONSPEC_F_OR_G; break;
+ case 'G': conspec = CONSPEC_F_OR_G_UP; break;
+ case 'a': conspec = CONSPEC_HEX_EXP; break;
+ case 'A': conspec = CONSPEC_HEX_EXP_UP; break;
+ case 'c': conspec = CONSPEC_CHAR; break;
+ case 's': conspec = CONSPEC_STRING; break;
+ case 'p': conspec = CONSPEC_POINTER; break;
+ case 'n': conspec = CONSPEC_BYTES_SO_FAR; break;
+ case 'C': conspec = CONSPEC_CHAR; lenmod = LENMOD_LONG; break;
+ case 'S': conspec = CONSPEC_STRING; lenmod = LENMOD_LONG; break;
+ case 'm': conspec = CONSPEC_STRERROR; arg_pos = -1; break;
+ default: conspec = CONSPEC_UNKNOWN;
+ }
+
+ /* Save the args. */
+ if (argcount >= max_argspecs)
+ {
+ /* We either need to allocate a new array instead of the
+ caller provided one or realloc the array. Instead of
+ using realloc we allocate a new one and release the
+ original one then. */
+ size_t n, newmax;
+ argspec_t newarg;
+
+ newmax = max_argspecs + ARGSPECS_BUMP_VALUE;
+ if (newmax <= max_argspecs)
+ goto leave_einval; /* Too many arguments. */
+ newarg = calloc (newmax, sizeof *newarg);
+ if (!newarg)
+ goto leave;
+ for (n=0; n < argcount; n++)
+ newarg[n] = argspecs[n];
+ if (argspecs != *argspecs_addr)
+ free (argspecs);
+ argspecs = newarg;
+ max_argspecs = newmax;
+ }
+
+ arg = argspecs + argcount;
+ arg->length = s - format + 2;
+ arg->flags = flags;
+ arg->width = width;
+ arg->precision = precision;
+ arg->lenmod = lenmod;
+ arg->conspec = conspec;
+ arg->arg_pos = arg_pos;
+ arg->width_pos = width_pos;
+ arg->precision_pos = precision_pos;
+ compute_type (arg);
+ argcount++;
+ format = s;
+ }
+
+ *argspecs_addr = argspecs;
+ *r_argspecs_count = argcount;
+ return 0; /* Success. */
+
+ leave_einval:
+ _set_errno (EINVAL);
+ leave:
+ if (argspecs != *argspecs_addr)
+ free (argspecs);
+ *argspecs_addr = NULL;
+ return -1;
+}
+
+
+/* This function reads all the values as specified by VALUETABLE into
+ VALUETABLE. The values are expected in VAARGS. The function
+ returns -1 if a specified type is not supported. */
+static int
+read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs)
+{
+ int validx;
+
+ for (validx=0; validx < valuetable_len; validx++)
+ {
+ value_t *value = &valuetable[validx].value;
+ valtype_t vt = valuetable[validx].vt;
+
+ switch (vt)
+ {
+ case VALTYPE_CHAR: value->a_char = va_arg (vaargs, int); break;
+ case VALTYPE_CHAR_PTR:
+ value->a_char_ptr = va_arg (vaargs, char *);
+ break;
+ case VALTYPE_SCHAR: value->a_schar = va_arg (vaargs, int); break;
+ case VALTYPE_SCHAR_PTR:
+ value->a_schar_ptr = va_arg (vaargs, signed char *);
+ break;
+ case VALTYPE_UCHAR: value->a_uchar = va_arg (vaargs, int); break;
+ case VALTYPE_SHORT: value->a_short = va_arg (vaargs, int); break;
+ case VALTYPE_USHORT: value->a_ushort = va_arg (vaargs, int); break;
+ case VALTYPE_SHORT_PTR:
+ value->a_short_ptr = va_arg (vaargs, short *);
+ break;
+ case VALTYPE_INT:
+ value->a_int = va_arg (vaargs, int);
+ break;
+ case VALTYPE_INT_PTR:
+ value->a_int_ptr = va_arg (vaargs, int *);
+ break;
+ case VALTYPE_UINT:
+ value->a_uint = va_arg (vaargs, unsigned int);
+ break;
+ case VALTYPE_LONG:
+ value->a_long = va_arg (vaargs, long);
+ break;
+ case VALTYPE_ULONG:
+ value->a_ulong = va_arg (vaargs, unsigned long);
+ break;
+ case VALTYPE_LONG_PTR:
+ value->a_long_ptr = va_arg (vaargs, long *);
+ break;
+#ifdef HAVE_LONG_LONG_INT
+ case VALTYPE_LONGLONG:
+ value->a_longlong = va_arg (vaargs, long long int);
+ break;
+ case VALTYPE_ULONGLONG:
+ value->a_ulonglong = va_arg (vaargs, unsigned long long int);
+ break;
+ case VALTYPE_LONGLONG_PTR:
+ value->a_longlong_ptr = va_arg (vaargs, long long *);
+ break;
+#endif
+ case VALTYPE_DOUBLE:
+ value->a_double = va_arg (vaargs, double);
+ break;
+#ifdef HAVE_LONG_DOUBLE
+ case VALTYPE_LONGDOUBLE:
+ value->a_longdouble = va_arg (vaargs, long double);
+ break;
+#endif
+ case VALTYPE_STRING:
+ value->a_string = va_arg (vaargs, const char *);
+ break;
+ case VALTYPE_POINTER:
+ value->a_void_ptr = va_arg (vaargs, void *);
+ break;
+#ifdef HAVE_INTMAX_T
+ case VALTYPE_INTMAX:
+ value->a_intmax = va_arg (vaargs, intmax_t);
+ break;
+ case VALTYPE_INTMAX_PTR:
+ value->a_intmax_ptr = va_arg (vaargs, intmax_t *);
+ break;
+#endif
+#ifdef HAVE_UINTMAX_T
+ case VALTYPE_UINTMAX:
+ value->a_uintmax = va_arg (vaargs, uintmax_t);
+ break;
+#endif
+ case VALTYPE_SIZE:
+ value->a_size = va_arg (vaargs, size_t);
+ break;
+ case VALTYPE_SIZE_PTR:
+ value->a_size_ptr = va_arg (vaargs, size_t *);
+ break;
+#ifdef HAVE_PTRDIFF_T
+ case VALTYPE_PTRDIFF:
+ value->a_ptrdiff = va_arg (vaargs, ptrdiff_t);
+ break;
+ case VALTYPE_PTRDIFF_PTR:
+ value->a_ptrdiff_ptr = va_arg (vaargs, ptrdiff_t *);
+ break;
+#endif
+ default: /* Unsupported type. */
+ return -1;
+ }
+ }
+ return 0;
+}
+
+
+
+/* Output COUNT padding characters PADCHAR and update NBYTES by the
+ number of bytes actually written. */
+static int
+pad_out (estream_printf_out_t outfnc, void *outfncarg,
+ int padchar, int count, size_t *nbytes)
+{
+ char buf[32];
+ size_t n;
+ int rc;
+
+ while (count > 0)
+ {
+ n = (count <= sizeof buf)? count : sizeof buf;
+ memset (buf, padchar, n);
+ rc = outfnc (outfncarg, buf, n);
+ if (rc)
+ return rc;
+ *nbytes += n;
+ count -= n;
+ }
+
+ return 0;
+}
+
+
+/* "d,i,o,u,x,X" formatting. OUTFNC and OUTFNCARG describes the
+ output routine, ARG gives the argument description and VALUE the
+ actual value (its type is available through arg->vt). */
+static int
+pr_integer (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ int rc;
+#ifdef HAVE_LONG_LONG_INT
+ unsigned long long aulong;
+#else
+ unsigned long aulong;
+#endif
+ char numbuf[100];
+ char *p, *pend;
+ size_t n;
+ char signchar = 0;
+ int n_prec; /* Number of extra precision digits required. */
+ int n_extra; /* Extra number of prefix or sign characters. */
+
+ if (arg->conspec == CONSPEC_DECIMAL)
+ {
+#ifdef HAVE_LONG_LONG_INT
+ long long along;
+#else
+ long along;
+#endif
+
+ switch (arg->vt)
+ {
+ case VALTYPE_SHORT: along = value.a_short; break;
+ case VALTYPE_INT: along = value.a_int; break;
+ case VALTYPE_LONG: along = value.a_long; break;
+#ifdef HAVE_LONG_LONG_INT
+ case VALTYPE_LONGLONG: along = value.a_longlong; break;
+ case VALTYPE_SIZE: along = value.a_size; break;
+# ifdef HAVE_INTMAX_T
+ case VALTYPE_INTMAX: along = value.a_intmax; break;
+# endif
+# ifdef HAVE_PTRDIFF_T
+ case VALTYPE_PTRDIFF: along = value.a_ptrdiff; break;
+# endif
+#endif /*HAVE_LONG_LONG_INT*/
+ default:
+ return -1;
+ }
+ if (along < 0)
+ {
+ aulong = -along;
+ signchar = '-';
+ }
+ else
+ aulong = along;
+ }
+ else
+ {
+ switch (arg->vt)
+ {
+ case VALTYPE_USHORT: aulong = value.a_ushort; break;
+ case VALTYPE_UINT: aulong = value.a_uint; break;
+ case VALTYPE_ULONG: aulong = value.a_ulong; break;
+#ifdef HAVE_LONG_LONG_INT
+ case VALTYPE_ULONGLONG: aulong = value.a_ulonglong; break;
+ case VALTYPE_SIZE: aulong = value.a_size; break;
+# ifdef HAVE_UINTMAX_T
+ case VALTYPE_UINTMAX: aulong = value.a_uintmax; break;
+# endif
+# ifdef HAVE_PTRDIFF_T
+ case VALTYPE_PTRDIFF: aulong = value.a_ptrdiff; break;
+# endif
+#endif /*HAVE_LONG_LONG_INT*/
+ default:
+ return -1;
+ }
+ }
+
+ if (signchar == '-')
+ ;
+ else if ((arg->flags & FLAG_PLUS_SIGN))
+ signchar = '+';
+ else if ((arg->flags & FLAG_SPACE_PLUS))
+ signchar = ' ';
+
+ n_extra = !!signchar;
+
+ /* We build the string up backwards. */
+ p = pend = numbuf + DIM(numbuf);
+ if ((!aulong && !arg->precision))
+ ;
+ else if (arg->conspec == CONSPEC_DECIMAL
+ || arg->conspec == CONSPEC_UNSIGNED)
+ {
+ int grouping = -1;
+ const char * grouping_string =
+#ifdef HAVE_LANGINFO_THOUSANDS_SEP
+ nl_langinfo(THOUSANDS_SEP);
+#else
+ "'";
+#endif
+
+ do
+ {
+ if ((arg->flags & FLAG_GROUPING)
+ && (++grouping == 3) && *grouping_string)
+ {
+ *--p = *grouping_string;
+ grouping = 0;
+ }
+ *--p = '0' + (aulong % 10);
+ aulong /= 10;
+ }
+ while (aulong);
+ }
+ else if (arg->conspec == CONSPEC_OCTAL)
+ {
+ do
+ {
+ *--p = '0' + (aulong % 8);
+ aulong /= 8;
+ }
+ while (aulong);
+ if ((arg->flags & FLAG_ALT_CONV) && *p != '0')
+ *--p = '0';
+ }
+ else /* HEX or HEXUP */
+ {
+ const char *digits = ((arg->conspec == CONSPEC_HEX)
+ ? "0123456789abcdef" : "0123456789ABCDEF");
+ do
+ {
+ *--p = digits[(aulong % 16)];
+ aulong /= 16;
+ }
+ while (aulong);
+ if ((arg->flags & FLAG_ALT_CONV))
+ n_extra += 2;
+ }
+
+ n = pend - p;
+
+ if ((arg->flags & FLAG_ZERO_PAD)
+ && arg->precision == NO_FIELD_VALUE && !(arg->flags & FLAG_LEFT_JUST)
+ && n && arg->width - n_extra > n )
+ n_prec = arg->width - n_extra - n;
+ else if (arg->precision > 0 && arg->precision > n)
+ n_prec = arg->precision - n;
+ else
+ n_prec = 0;
+
+ if (!(arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width - n_extra > n
+ && arg->width - n_extra - n >= n_prec )
+ {
+ rc = pad_out (outfnc, outfncarg, ' ',
+ arg->width - n_extra - n - n_prec, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ if (signchar)
+ {
+ rc = outfnc (outfncarg, &signchar, 1);
+ if (rc)
+ return rc;
+ *nbytes += 1;
+ }
+
+ if ((arg->flags & FLAG_ALT_CONV)
+ && (arg->conspec == CONSPEC_HEX || arg->conspec == CONSPEC_HEX_UP))
+ {
+ rc = outfnc (outfncarg, arg->conspec == CONSPEC_HEX? "0x": "0X", 2);
+ if (rc)
+ return rc;
+ *nbytes += 2;
+ }
+
+ if (n_prec)
+ {
+ rc = pad_out (outfnc, outfncarg, '0', n_prec, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ rc = outfnc (outfncarg, p, pend - p);
+ if (rc)
+ return rc;
+ *nbytes += pend - p;
+
+ if ((arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width - n_extra - n_prec > n)
+ {
+ rc = pad_out (outfnc, outfncarg, ' ',
+ arg->width - n_extra - n_prec - n, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ return 0;
+}
+
+
+/* "e,E,f,F,g,G,a,A" formatting. OUTFNC and OUTFNCARG describes the
+ output routine, ARG gives the argument description and VALUE the
+ actual value (its type is available through arg->vt). For
+ portability reasons sprintf is used for the actual formatting.
+ This is useful because sprint is the only standard function to
+ convert a floating number into its ascii representation. To avoid
+ using malloc we just pass the precision to sprintf and do the final
+ formatting with our own code. */
+static int
+pr_float (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ int rc;
+#ifdef HAVE_LONG_DOUBLE
+ long double adblfloat = 0; /* Just to please gcc. */
+ int use_dbl = 0;
+#endif
+ double afloat;
+ char numbuf[350];
+ char formatstr[20];
+ char *p, *pend;
+ size_t n;
+ char signchar = 0;
+ int n_extra; /* Extra number of prefix or sign characters. */
+
+ switch (arg->vt)
+ {
+ case VALTYPE_DOUBLE: afloat = value.a_double; break;
+#ifdef HAVE_LONG_DOUBLE
+ case VALTYPE_LONGDOUBLE:
+ afloat = 0; /* Just to please gcc. */
+ adblfloat = value.a_longdouble;
+ use_dbl=1; break;
+#endif
+ default:
+ return -1;
+ }
+
+ /* We build the string using sprint. */
+ p = formatstr + sizeof formatstr;
+ *--p = 0;
+ switch (arg->conspec)
+ {
+ case CONSPEC_FLOAT: *--p = 'f'; break;
+ case CONSPEC_FLOAT_UP: *--p = 'F'; break;
+ case CONSPEC_EXP: *--p = 'e'; break;
+ case CONSPEC_EXP_UP: *--p = 'E'; break;
+ case CONSPEC_F_OR_G: *--p = 'g'; break;
+ case CONSPEC_F_OR_G_UP: *--p = 'G'; break;
+ case CONSPEC_HEX_EXP: *--p = 'a'; break;
+ case CONSPEC_HEX_EXP_UP: *--p = 'A'; break;
+ default:
+ return -1; /* Actually a bug. */
+ }
+#ifdef HAVE_LONG_DOUBLE
+ if (use_dbl)
+ *--p = 'L';
+#endif
+ if (arg->precision != NO_FIELD_VALUE)
+ {
+ /* Limit it to a meaningful value so that even a stupid sprintf
+ won't overflow our buffer. */
+ n = arg->precision <= 100? arg->precision : 100;
+ do
+ {
+ *--p = '0' + (n % 10);
+ n /= 10;
+ }
+ while (n);
+ *--p = '.';
+ }
+ if ((arg->flags & FLAG_ALT_CONV))
+ *--p = '#';
+ *--p = '%';
+#ifdef HAVE_LONG_DOUBLE
+ if (use_dbl)
+ sprintf (numbuf, p, adblfloat);
+ else
+#endif /*HAVE_LONG_DOUBLE*/
+ sprintf (numbuf, p, afloat);
+ p = numbuf;
+ n = strlen (numbuf);
+ pend = p + n;
+
+ if (*p =='-')
+ {
+ signchar = '-';
+ p++;
+ n--;
+ }
+ else if ((arg->flags & FLAG_PLUS_SIGN))
+ signchar = '+';
+ else if ((arg->flags & FLAG_SPACE_PLUS))
+ signchar = ' ';
+
+ n_extra = !!signchar;
+
+ if (!(arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width - n_extra > n)
+ {
+ rc = pad_out (outfnc, outfncarg, ' ', arg->width - n_extra - n, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ if (signchar)
+ {
+ rc = outfnc (outfncarg, &signchar, 1);
+ if (rc)
+ return rc;
+ *nbytes += 1;
+ }
+
+ rc = outfnc (outfncarg, p, pend - p);
+ if (rc)
+ return rc;
+ *nbytes += pend - p;
+
+ if ((arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width - n_extra > n)
+ {
+ rc = pad_out (outfnc, outfncarg, ' ', arg->width - n_extra - n, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ return 0;
+}
+
+
+/* "c" formatting. */
+static int
+pr_char (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ int rc;
+ char buf[1];
+
+ if (arg->vt != VALTYPE_INT)
+ return -1;
+ buf[0] = (unsigned int)value.a_int;
+ rc = outfnc (outfncarg, buf, 1);
+ if(rc)
+ return rc;
+ *nbytes += 1;
+
+ return 0;
+}
+
+
+/* "s" formatting. */
+static int
+pr_string (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ int rc;
+ size_t n;
+ const char *string, *s;
+
+ if (arg->vt != VALTYPE_STRING)
+ return -1;
+ string = value.a_string;
+ if (!string)
+ string = "(null)";
+ if (arg->precision >= 0)
+ {
+ /* Test for nul after N so that we can pass a non-nul terminated
+ string. */
+ for (n=0,s=string; n < arg->precision && *s; s++)
+ n++;
+ }
+ else
+ n = strlen (string);
+
+ if (!(arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width > n )
+ {
+ rc = pad_out (outfnc, outfncarg, ' ', arg->width - n, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ rc = outfnc (outfncarg, string, n);
+ if (rc)
+ return rc;
+ *nbytes += n;
+
+ if ((arg->flags & FLAG_LEFT_JUST)
+ && arg->width >= 0 && arg->width > n)
+ {
+ rc = pad_out (outfnc, outfncarg, ' ', arg->width - n, nbytes);
+ if (rc)
+ return rc;
+ }
+
+ return 0;
+}
+
+
+/* "p" formatting. */
+static int
+pr_pointer (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ int rc;
+#if defined(HAVE_LONG_LONG_INT) && (SIZEOF_UNSIGNED_LONG < SIZEOF_VOID_P)
+ unsigned long long aulong;
+#else
+ unsigned long aulong;
+#endif
+ char numbuf[100];
+ char *p, *pend;
+
+ if (arg->vt != VALTYPE_POINTER)
+ return -1;
+ /* We assume that a pointer can be converted to an unsigned long.
+ That is not correct for a 64 bit Windows, but then we assume that
+ long long is supported and usable for storing a pointer. */
+#if defined(HAVE_LONG_LONG_INT) && (SIZEOF_UNSIGNED_LONG < SIZEOF_VOID_P)
+ aulong = (unsigned long long)value.a_void_ptr;
+#else
+ aulong = (unsigned long)value.a_void_ptr;
+#endif
+
+ p = pend = numbuf + DIM(numbuf);
+ do
+ {
+ *--p = "0123456789abcdefx"[(aulong % 16)];
+ aulong /= 16;
+ }
+ while (aulong);
+ while ((pend-p) < 2*sizeof (aulong))
+ *--p = '0';
+ *--p = 'x';
+ *--p = '0';
+
+ rc = outfnc (outfncarg, p, pend - p);
+ if (rc)
+ return rc;
+ *nbytes += pend - p;
+
+ return 0;
+}
+
+/* "n" pesudo format operation. */
+static int
+pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg,
+ argspec_t arg, value_t value, size_t *nbytes)
+{
+ (void)outfnc;
+ (void)outfncarg;
+
+ switch (arg->vt)
+ {
+ case VALTYPE_SCHAR_PTR:
+ *value.a_schar_ptr = (signed char)(unsigned int)(*nbytes);
+ break;
+ case VALTYPE_SHORT_PTR:
+ *value.a_short_ptr = (short)(unsigned int)(*nbytes);
+ break;
+ case VALTYPE_LONG_PTR:
+ *value.a_long_ptr = (long)(*nbytes);
+ break;
+#ifdef HAVE_LONG_LONG_INT
+ case VALTYPE_LONGLONG_PTR:
+ *value.a_longlong_ptr = (long long)(*nbytes);
+ break;
+#endif
+#ifdef HAVE_INTMAX_T
+ case VALTYPE_INTMAX_PTR:
+ *value.a_intmax_ptr = (intmax_t)(*nbytes);
+ break;
+#endif
+ case VALTYPE_SIZE_PTR:
+ *value.a_size_ptr = (*nbytes);
+ break;
+#ifdef HAVE_PTRDIFF_T
+ case VALTYPE_PTRDIFF_PTR:
+ *value.a_ptrdiff_ptr = (ptrdiff_t)(*nbytes);
+ break;
+#endif
+ case VALTYPE_INT_PTR:
+ *value.a_int_ptr = (int)(*nbytes);
+ break;
+ default:
+ return -1; /* An unsupported type has been used. */
+ }
+
+ return 0;
+}
+
+
+
+/* Run the actual formatting. OUTFNC and OUTFNCARG are the output
+ functions. FORMAT is format string ARGSPECS is the parsed format
+ string, ARGSPECS_LEN the number of items in ARGSPECS. VALUETABLE
+ holds the values and may be directly addressed using the position
+ arguments given by ARGSPECS. MYERRNO is used for the "%m"
+ conversion. NBYTES well be updated to reflect the number of bytes
+ send to the output function. */
+static int
+do_format (estream_printf_out_t outfnc, void *outfncarg,
+ const char *format, argspec_t argspecs, size_t argspecs_len,
+ valueitem_t valuetable, int myerrno, size_t *nbytes)
+{
+ int rc = 0;
+ const char *s;
+ argspec_t arg = argspecs;
+ int argidx = 0; /* Only used for assertion. */
+ size_t n;
+ value_t value;
+
+ s = format;
+ while ( *s )
+ {
+ if (*s != '%')
+ {
+ s++;
+ continue;
+ }
+ if (s != format)
+ {
+ rc = outfnc (outfncarg, format, (n=s-format));
+ if (rc)
+ return rc;
+ *nbytes += n;
+ }
+ if (s[1] == '%')
+ {
+ /* Note that this code ignores one trailing percent escape -
+ this is however okay as the args parser must have
+ detected this already. */
+ rc = outfnc (outfncarg, s, 1);
+ if (rc)
+ return rc;
+ *nbytes += 1;
+ s += 2;
+ format = s;
+ continue;
+ }
+
+ /* Save the next start. */
+ s += arg->length;
+ format = s;
+
+ assert (argidx < argspecs_len);
+ argidx++;
+
+ /* Apply indirect field width and precision values. */
+ if (arg->width == STAR_FIELD_VALUE)
+ {
+ assert (valuetable[arg->width_pos-1].vt == VALTYPE_INT);
+ arg->width = valuetable[arg->width_pos-1].value.a_int;
+ if (arg->width < 0)
+ {
+ arg->width = -arg->width;
+ arg->flags |= FLAG_LEFT_JUST;
+ }
+ }
+ if (arg->precision == STAR_FIELD_VALUE)
+ {
+ assert (valuetable[arg->precision_pos-1].vt == VALTYPE_INT);
+ arg->precision = valuetable[arg->precision_pos-1].value.a_int;
+ if (arg->precision < 0)
+ arg->precision = NO_FIELD_VALUE;
+ }
+
+ if (arg->arg_pos == -1 && arg->conspec == CONSPEC_STRERROR)
+ value.a_string = strerror (myerrno);
+ else
+ {
+ assert (arg->vt == valuetable[arg->arg_pos-1].vt);
+ value = valuetable[arg->arg_pos-1].value;
+ }
+
+ switch (arg->conspec)
+ {
+ case CONSPEC_UNKNOWN: assert (!"bug"); break;
+
+ case CONSPEC_DECIMAL:
+ case CONSPEC_UNSIGNED:
+ case CONSPEC_OCTAL:
+ case CONSPEC_HEX:
+ case CONSPEC_HEX_UP:
+ rc = pr_integer (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ case CONSPEC_FLOAT:
+ case CONSPEC_FLOAT_UP:
+ case CONSPEC_EXP:
+ case CONSPEC_EXP_UP:
+ case CONSPEC_F_OR_G:
+ case CONSPEC_F_OR_G_UP:
+ case CONSPEC_HEX_EXP:
+ case CONSPEC_HEX_EXP_UP:
+ rc = pr_float (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ case CONSPEC_CHAR:
+ rc = pr_char (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ case CONSPEC_STRING:
+ case CONSPEC_STRERROR:
+ rc = pr_string (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ case CONSPEC_POINTER:
+ rc = pr_pointer (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ case CONSPEC_BYTES_SO_FAR:
+ rc = pr_bytes_so_far (outfnc, outfncarg, arg, value, nbytes);
+ break;
+ }
+ if (rc)
+ return rc;
+ arg++;
+ }
+
+ /* Print out any trailing stuff. */
+ n = s - format;
+ rc = n? outfnc (outfncarg, format, n) : 0;
+ if (!rc)
+ *nbytes += n;
+
+ return rc;
+}
+
+
+
+
+/* The versatile printf formatting routine. It expects a callback
+ function OUTFNC and an opaque argument OUTFNCARG used for actual
+ output of the formatted stuff. FORMAT is the format specification
+ and VAARGS a variable argumemt list matching the arguments of
+ FORMAT. */
+int
+_gpgrt_estream_format (estream_printf_out_t outfnc,
+ void *outfncarg,
+ const char *format, va_list vaargs)
+{
+ /* Buffer to hold the argspecs and a pointer to it.*/
+ struct argspec_s argspecs_buffer[DEFAULT_MAX_ARGSPECS];
+ argspec_t argspecs = argspecs_buffer;
+ size_t argspecs_len; /* Number of specifications in ARGSPECS. */
+
+ /* Buffer to hold the description for the values. */
+ struct valueitem_s valuetable_buffer[DEFAULT_MAX_VALUES];
+ valueitem_t valuetable = valuetable_buffer;
+
+ int rc; /* Return code. */
+ size_t argidx; /* Used to index the argspecs array. */
+ size_t validx; /* Used to index the valuetable. */
+ int max_pos;/* Highest argument position. */
+
+ size_t nbytes = 0; /* Keep track of the number of bytes passed to
+ the output function. */
+
+ int myerrno = errno; /* Save the errno for use with "%m". */
+
+
+ /* Parse the arguments to come up with descriptive list. We can't
+ do this on the fly because we need to support positional
+ arguments. */
+ rc = parse_format (format, &argspecs, DIM(argspecs_buffer), &argspecs_len);
+ if (rc)
+ goto leave;
+
+ /* Check that all ARG_POS fields are set. */
+ for (argidx=0,max_pos=0; argidx < argspecs_len; argidx++)
+ {
+ if (argspecs[argidx].arg_pos != -1
+ && argspecs[argidx].arg_pos > max_pos)
+ max_pos = argspecs[argidx].arg_pos;
+ if (argspecs[argidx].width_pos > max_pos)
+ max_pos = argspecs[argidx].width_pos;
+ if (argspecs[argidx].precision_pos > max_pos)
+ max_pos = argspecs[argidx].precision_pos;
+ }
+ if (!max_pos)
+ {
+ /* Fill in all the positions. */
+ for (argidx=0; argidx < argspecs_len; argidx++)
+ {
+ if (argspecs[argidx].width == STAR_FIELD_VALUE)
+ argspecs[argidx].width_pos = ++max_pos;
+ if (argspecs[argidx].precision == STAR_FIELD_VALUE)
+ argspecs[argidx].precision_pos = ++max_pos;
+ if (argspecs[argidx].arg_pos != -1 )
+ argspecs[argidx].arg_pos = ++max_pos;
+ }
+ }
+ else
+ {
+ /* Check that they are all filled. More test are done later. */
+ for (argidx=0; argidx < argspecs_len; argidx++)
+ {
+ if (!argspecs[argidx].arg_pos
+ || (argspecs[argidx].width == STAR_FIELD_VALUE
+ && !argspecs[argidx].width_pos)
+ || (argspecs[argidx].precision == STAR_FIELD_VALUE
+ && !argspecs[argidx].precision_pos))
+ goto leave_einval;
+ }
+ }
+ /* Check that there is no overflow in max_pos and that it has a
+ reasonable length. There may never be more elements than the
+ number of characters in FORMAT. */
+ if (max_pos < 0 || max_pos >= strlen (format))
+ goto leave_einval;
+
+#ifdef DEBUG
+ dump_argspecs (argspecs, argspecs_len);
+#endif
+
+ /* Allocate a table to hold the values. If it is small enough we
+ use a stack allocated buffer. */
+ if (max_pos > DIM(valuetable_buffer))
+ {
+ valuetable = calloc (max_pos, sizeof *valuetable);
+ if (!valuetable)
+ goto leave_error;
+ }
+ else
+ {
+ for (validx=0; validx < DIM(valuetable_buffer); validx++)
+ valuetable[validx].vt = VALTYPE_UNSUPPORTED;
+ }
+ for (argidx=0; argidx < argspecs_len; argidx++)
+ {
+ if (argspecs[argidx].arg_pos != - 1)
+ {
+ validx = argspecs[argidx].arg_pos - 1;
+ if (valuetable[validx].vt)
+ goto leave_einval; /* Already defined. */
+ valuetable[validx].vt = argspecs[argidx].vt;
+ }
+ if (argspecs[argidx].width == STAR_FIELD_VALUE)
+ {
+ validx = argspecs[argidx].width_pos - 1;
+ if (valuetable[validx].vt)
+ goto leave_einval; /* Already defined. */
+ valuetable[validx].vt = VALTYPE_INT;
+ }
+ if (argspecs[argidx].precision == STAR_FIELD_VALUE)
+ {
+ validx = argspecs[argidx].precision_pos - 1;
+ if (valuetable[validx].vt)
+ goto leave_einval; /* Already defined. */
+ valuetable[validx].vt = VALTYPE_INT;
+ }
+ }
+
+ /* Read all the arguments. This will error out for unsupported
+ types and for not given positional arguments. */
+ rc = read_values (valuetable, max_pos, vaargs);
+ if (rc)
+ goto leave_einval;
+
+/* for (validx=0; validx < max_pos; validx++) */
+/* fprintf (stderr, "%2d: vt=%d\n", validx, valuetable[validx].vt); */
+
+ /* Everything has been collected, go ahead with the formatting. */
+ rc = do_format (outfnc, outfncarg, format,
+ argspecs, argspecs_len, valuetable, myerrno, &nbytes);
+
+ goto leave;
+
+ leave_einval:
+ _set_errno (EINVAL);
+ leave_error:
+ rc = -1;
+ leave:
+ if (valuetable != valuetable_buffer)
+ free (valuetable);
+ if (argspecs != argspecs_buffer)
+ free (argspecs);
+ return rc;
+}
+
+
+
+
+/* A simple output handler utilizing stdio. */
+static int
+plain_stdio_out (void *outfncarg, const char *buf, size_t buflen)
+{
+ FILE *fp = (FILE*)outfncarg;
+
+ if ( fwrite (buf, buflen, 1, fp) != 1 )
+ return -1;
+ return 0;
+}
+
+
+/* A replacement for printf. */
+int
+_gpgrt_estream_printf (const char *format, ...)
+{
+ int rc;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ rc = _gpgrt_estream_format (plain_stdio_out, stderr, format, arg_ptr);
+ va_end (arg_ptr);
+
+ return rc;
+}
+
+/* A replacement for fprintf. */
+int
+_gpgrt_estream_fprintf (FILE *fp, const char *format, ...)
+{
+ int rc;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ rc = _gpgrt_estream_format (plain_stdio_out, fp, format, arg_ptr);
+ va_end (arg_ptr);
+
+ return rc;
+}
+
+/* A replacement for vfprintf. */
+int
+_gpgrt_estream_vfprintf (FILE *fp, const char *format, va_list arg_ptr)
+{
+ return _gpgrt_estream_format (plain_stdio_out, fp, format, arg_ptr);
+}
+
+
+
+/* Communication object used between estream_snprintf and
+ fixed_buffer_out. */
+struct fixed_buffer_parm_s
+{
+ size_t size; /* Size of the buffer. */
+ size_t count; /* Number of bytes requested for output. */
+ size_t used; /* Used size of the buffer. */
+ char *buffer; /* Provided buffer. */
+};
+
+/* A simple malloced buffer output handler. */
+static int
+fixed_buffer_out (void *outfncarg, const char *buf, size_t buflen)
+{
+ struct fixed_buffer_parm_s *parm = outfncarg;
+
+ parm->count += buflen;
+
+ if (!parm->buffer)
+ ;
+ else if (parm->used + buflen < parm->size)
+ {
+ /* Handle the common case that everything fits into the buffer
+ separately. */
+ memcpy (parm->buffer + parm->used, buf, buflen);
+ parm->used += buflen;
+ }
+ else
+ {
+ /* The slow version of above. */
+ for ( ;buflen && parm->used < parm->size; buflen--)
+ parm->buffer[parm->used++] = *buf++;
+ }
+
+ return 0;
+}
+
+
+/* A replacement for vsnprintf. */
+int
+_gpgrt_estream_vsnprintf (char *buf, size_t bufsize,
+ const char *format, va_list arg_ptr)
+{
+ struct fixed_buffer_parm_s parm;
+ int rc;
+
+ parm.size = bufsize;
+ parm.count = 0;
+ parm.used = 0;
+ parm.buffer = bufsize?buf:NULL;
+ rc = _gpgrt_estream_format (fixed_buffer_out, &parm, format, arg_ptr);
+ if (!rc)
+ rc = fixed_buffer_out (&parm, "", 1); /* Print terminating Nul. */
+ if (rc == -1)
+ return -1;
+ if (bufsize && buf && parm.size && parm.count >= parm.size)
+ buf[parm.size-1] = 0;
+
+ parm.count--; /* Do not count the trailing nul. */
+ return (int)parm.count; /* Return number of bytes which would have
+ been written. */
+}
+
+/* A replacement for snprintf. */
+int
+_gpgrt_estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
+{
+ int rc;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ rc = _gpgrt_estream_vsnprintf (buf, bufsize, format, arg_ptr);
+ va_end (arg_ptr);
+
+ return rc;
+}
+
+
+
+/* Communication object used between estream_asprintf and
+ dynamic_buffer_out. */
+struct dynamic_buffer_parm_s
+{
+ int error_flag; /* Internal helper. */
+ size_t alloced; /* Allocated size of the buffer. */
+ size_t used; /* Used size of the buffer. */
+ char *buffer; /* Malloced buffer. */
+};
+
+/* A simple malloced buffer output handler. */
+static int
+dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen)
+{
+ struct dynamic_buffer_parm_s *parm = outfncarg;
+
+ if (parm->error_flag)
+ {
+ /* Just in case some formatting routine did not checked for an
+ error. */
+ _set_errno (parm->error_flag);
+ return -1;
+ }
+
+ if (parm->used + buflen >= parm->alloced)
+ {
+ char *p;
+
+ parm->alloced += buflen + 512;
+ p = my_printf_realloc (parm->buffer, parm->alloced);
+ if (!p)
+ {
+ parm->error_flag = errno ? errno : ENOMEM;
+ /* Wipe out what we already accumulated. This is useful in
+ case sensitive data is formatted. */
+ memset (parm->buffer, 0, parm->used);
+ return -1;
+ }
+ parm->buffer = p;
+ }
+ memcpy (parm->buffer + parm->used, buf, buflen);
+ parm->used += buflen;
+
+ return 0;
+}
+
+
+/* A replacement for vasprintf. As with the BSD version of vasprintf
+ -1 will be returned on error and NULL stored at BUFP. On success
+ the number of bytes printed will be returned. */
+int
+_gpgrt_estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
+{
+ struct dynamic_buffer_parm_s parm;
+ int rc;
+
+ parm.error_flag = 0;
+ parm.alloced = 512;
+ parm.used = 0;
+ parm.buffer = my_printf_realloc (NULL, parm.alloced);
+ if (!parm.buffer)
+ {
+ *bufp = NULL;
+ return -1;
+ }
+
+ rc = _gpgrt_estream_format (dynamic_buffer_out, &parm, format, arg_ptr);
+ if (!rc)
+ rc = dynamic_buffer_out (&parm, "", 1); /* Print terminating Nul. */
+ /* Fixme: Should we shrink the resulting buffer? */
+ if (rc != -1 && parm.error_flag)
+ {
+ rc = -1;
+ _set_errno (parm.error_flag);
+ }
+ if (rc == -1)
+ {
+ memset (parm.buffer, 0, parm.used);
+ if (parm.buffer)
+ my_printf_realloc (parm.buffer, 0);
+ *bufp = NULL;
+ return -1;
+ }
+ assert (parm.used); /* We have at least the terminating Nul. */
+ *bufp = parm.buffer;
+ return parm.used - 1; /* Do not include that Nul. */
+}
+
+/* A replacement for asprintf. As with the BSD of asprintf version -1
+ will be returned on error and NULL stored at BUFP. On success the
+ number of bytes printed will be returned. */
+int
+_gpgrt_estream_asprintf (char **bufp, const char *format, ...)
+{
+ int rc;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ rc = _gpgrt_estream_vasprintf (bufp, format, arg_ptr);
+ va_end (arg_ptr);
+
+ return rc;
+}
+
+/* A variant of asprintf. The function returns the allocated buffer
+ or NULL on error; ERRNO is set in the error case. The caller
+ should use es_free to release the buffer. This function actually
+ belongs into estream-printf but we put it here as a convenience
+ and because es_free is required anyway. */
+char *
+_gpgrt_estream_bsprintf (const char *format, ...)
+{
+ int rc;
+ va_list ap;
+ char *buf;
+
+ va_start (ap, format);
+ rc = _gpgrt_estream_vasprintf (&buf, format, ap);
+ va_end (ap);
+ if (rc < 0)
+ return NULL;
+ return buf;
+}
diff --git a/src/estream-printf.h b/src/estream-printf.h
new file mode 100644
index 0000000..ae303a7
--- /dev/null
+++ b/src/estream-printf.h
@@ -0,0 +1,151 @@
+/* estream-printf.h - Versatile mostly C-99 compliant printf formatting.
+ * Copyright (C) 2007, 2010, 2012 g10 Code GmbH
+ *
+ * This file is part of Libestream.
+ *
+ * Libestream is free software; you can redistribute it 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.
+ *
+ * Libestream is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libestream; if not, see <https://www.gnu.org/licenses/>.
+ *
+ * ALTERNATIVELY, Libestream may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, and the entire permission notice in its entirety,
+ * including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ESTREAM_PRINTF_H
+#define ESTREAM_PRINTF_H
+
+#include <stdarg.h>
+#include <stdio.h>
+
+/* To use this file with libraries the following macro is useful:
+
+ #define _ESTREAM_EXT_SYM_PREFIX _foo_
+
+ This prefixes all external symbols with "_foo_".
+
+ For the implementation of the code (estream-printf.c) the following
+ macros may be used to tune the implementation for certain systems:
+
+ #define _ESTREAM_PRINTF_REALLOC foo_realloc
+
+ Make estream_asprintf and estream_vasprintf use foo_realloc
+ instead of the standard realloc to allocate memory returned to
+ the caller. Note that foo_realloc needs to be C-90 compliant:
+ foo_realloc (NULL,n) is the same as a call to malloc(n) and
+ foo_realloc (a, 0) is the same as a call to free (a).
+
+ #define _ESTREAM_PRINTF_EXTRA_INCLUDE "foo.h"
+
+ This includes the file "foo.h" which may provide prototypes for
+ the custom memory allocation functions.
+ */
+
+
+#ifdef _ESTREAM_EXT_SYM_PREFIX
+#ifndef _ESTREAM_PREFIX
+#define _ESTREAM_PREFIX1(x,y) x ## y
+#define _ESTREAM_PREFIX2(x,y) _ESTREAM_PREFIX1(x,y)
+#define _ESTREAM_PREFIX(x) _ESTREAM_PREFIX2(_ESTREAM_EXT_SYM_PREFIX,x)
+#endif /*_ESTREAM_PREFIX*/
+#define estream_printf_out_t _ESTREAM_PREFIX(estream_printf_out_t)
+#define estream_format _ESTREAM_PREFIX(estream_format)
+#define estream_printf _ESTREAM_PREFIX(estream_printf)
+#define estream_fprintf _ESTREAM_PREFIX(estream_fprintf)
+#define estream_vfprintf _ESTREAM_PREFIX(estream_vfprintf)
+#define estream_snprintf _ESTREAM_PREFIX(estream_snprintf)
+#define estream_vsnprintf _ESTREAM_PREFIX(estream_vsnprintf)
+#define estream_asprintf _ESTREAM_PREFIX(estream_asprintf)
+#define estream_vasprintf _ESTREAM_PREFIX(estream_vasprintf)
+#endif /*_ESTREAM_EXT_SYM_PREFIX*/
+
+#ifndef _ESTREAM_GCC_A_PRINTF
+# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4 )
+# define _ESTREAM_GCC_A_PRINTF( f, a ) \
+ __attribute__ ((format (__gnu_printf__,f,a)))
+# elif __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+# define _ESTREAM_GCC_A_PRINTF( f, a ) \
+ __attribute__ ((format (printf,f,a)))
+# else
+# define _ESTREAM_GCC_A_PRINTF( f, a )
+# endif
+#endif /*_ESTREAM_GCC_A_PRINTF*/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#if 0
+}
+#endif
+#endif
+
+
+typedef int (*estream_printf_out_t)
+ (void *outfncarg, const char *buf, size_t buflen);
+
+int _gpgrt_estream_format (estream_printf_out_t outfnc, void *outfncarg,
+ const char *format, va_list vaargs)
+ _ESTREAM_GCC_A_PRINTF(3,0);
+int _gpgrt_estream_printf (const char *format, ...)
+ _ESTREAM_GCC_A_PRINTF(1,2);
+int _gpgrt_estream_fprintf (FILE *fp, const char *format, ... )
+ _ESTREAM_GCC_A_PRINTF(2,3);
+int _gpgrt_estream_vfprintf (FILE *fp, const char *format, va_list arg_ptr)
+ _ESTREAM_GCC_A_PRINTF(2,0);
+int _gpgrt_estream_snprintf (char *buf, size_t bufsize, const char *format, ...)
+ _ESTREAM_GCC_A_PRINTF(3,4);
+int _gpgrt_estream_vsnprintf (char *buf,size_t bufsize,
+ const char *format, va_list arg_ptr)
+ _ESTREAM_GCC_A_PRINTF(3,0);
+int _gpgrt_estream_asprintf (char **bufp, const char *format, ...)
+ _ESTREAM_GCC_A_PRINTF(2,3);
+int _gpgrt_estream_vasprintf (char **bufp, const char *format, va_list arg_ptr)
+ _ESTREAM_GCC_A_PRINTF(2,0);
+char *_gpgrt_estream_bsprintf (const char *format, ...)
+ _ESTREAM_GCC_A_PRINTF(1,2);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /*ESTREAM_PRINTF_H*/
diff --git a/src/estream.c b/src/estream.c
new file mode 100644
index 0000000..9f227a6
--- /dev/null
+++ b/src/estream.c
@@ -0,0 +1,5196 @@
+/* estream.c - Extended Stream I/O Library
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011,
+ * 2014, 2015, 2016, 2017 g10 Code GmbH
+ *
+ * This file is part of Libestream.
+ *
+ * Libestream is free software; you can redistribute it 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.
+ *
+ * Libestream is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libestream; if not, see <https://www.gnu.org/licenses/>.
+ *
+ * ALTERNATIVELY, Libestream may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, and the entire permission notice in its entirety,
+ * including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef USE_ESTREAM_SUPPORT_H
+# include <estream-support.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(_WIN32) && !defined(HAVE_W32_SYSTEM)
+# define HAVE_W32_SYSTEM 1
+# if defined(__MINGW32CE__) && !defined (HAVE_W32CE_SYSTEM)
+# define HAVE_W32CE_SYSTEM
+# endif
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stddef.h>
+#include <assert.h>
+#ifdef HAVE_W32_SYSTEM
+# ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+# include <windows.h>
+#endif
+
+/* Enable tracing. The value is the module name to be printed. */
+/*#define ENABLE_TRACING "estream"*/
+
+#include "gpgrt-int.h"
+#include "estream-printf.h"
+#include "thread.h"
+#include "lock.h"
+
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+#ifndef HAVE_DOSISH_SYSTEM
+# ifdef HAVE_W32_SYSTEM
+# define HAVE_DOSISH_SYSTEM 1
+# endif
+#endif
+
+
+#ifdef HAVE_W32_SYSTEM
+# ifndef S_IRGRP
+# define S_IRGRP S_IRUSR
+# endif
+# ifndef S_IROTH
+# define S_IROTH S_IRUSR
+# endif
+# ifndef S_IWGRP
+# define S_IWGRP S_IWUSR
+# endif
+# ifndef S_IWOTH
+# define S_IWOTH S_IWUSR
+# endif
+# ifndef S_IXGRP
+# define S_IXGRP S_IXUSR
+# endif
+# ifndef S_IXOTH
+# define S_IXOTH S_IXUSR
+# endif
+#endif
+
+#if !defined (EWOULDBLOCK) && defined (HAVE_W32_SYSTEM)
+/* Compatibility with errno.h from mingw-2.0 */
+# define EWOULDBLOCK 140
+#endif
+
+#ifndef EAGAIN
+# define EAGAIN EWOULDBLOCK
+#endif
+
+
+#ifdef HAVE_W32CE_SYSTEM
+# define _set_errno(a) gpg_err_set_errno ((a))
+/* Setmode is missing in cegcc but available since CE 5.0. */
+int _setmode (int handle, int mode);
+# define setmode(a,b) _setmode ((a),(b))
+#else
+# define _set_errno(a) do { errno = (a); } while (0)
+#endif
+
+#ifdef HAVE_W32_SYSTEM
+# define IS_INVALID_FD(a) ((void*)(a) == (void*)(-1)) /* ?? FIXME. */
+#else
+# define IS_INVALID_FD(a) ((a) == -1)
+#endif
+
+/* Calculate array dimension. */
+#ifndef DIM
+#define DIM(array) (sizeof (array) / sizeof (*array))
+#endif
+
+/* A helper macro used to convert to a hex string. */
+#define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
+
+
+/* Generally used types. */
+
+typedef void *(*func_realloc_t) (void *mem, size_t size);
+typedef void (*func_free_t) (void *mem);
+
+
+
+
+/*
+ * A linked list to hold active stream objects.
+ * Protected by ESTREAM_LIST_LOCK.
+ */
+struct estream_list_s
+{
+ struct estream_list_s *next;
+ estream_t stream; /* Entry is not used if NULL. */
+};
+typedef struct estream_list_s *estream_list_t;
+static estream_list_t estream_list;
+
+/*
+ * File descriptors registered for use as the standard file handles.
+ * Protected by ESTREAM_LIST_LOCK.
+ */
+static int custom_std_fds[3];
+static unsigned char custom_std_fds_valid[3];
+
+/*
+ * A lock object to protect ESTREAM LIST, CUSTOM_STD_FDS and
+ * CUSTOM_STD_FDS_VALID. Used by lock_list() and unlock_list().
+ */
+GPGRT_LOCK_DEFINE (estream_list_lock);
+
+
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_syscall_func)(void);
+static void (*post_syscall_func)(void);
+
+
+/*
+ * Error code replacements.
+ */
+#ifndef EOPNOTSUPP
+# define EOPNOTSUPP ENOSYS
+#endif
+
+
+/* Local prototypes. */
+static void fname_set_internal (estream_t stream, const char *fname, int quote);
+
+
+
+
+/*
+ * Memory allocation wrappers used in this file.
+ */
+static void *
+mem_alloc (size_t n)
+{
+ return _gpgrt_malloc (n);
+}
+
+static void *
+mem_realloc (void *p, size_t n)
+{
+ return _gpgrt_realloc (p, n);
+}
+
+static void
+mem_free (void *p)
+{
+ if (p)
+ _gpgrt_free (p);
+}
+
+
+/*
+ * A Windows helper function to map a W32 API error code to a standard
+ * system error code.
+ */
+#ifdef HAVE_W32_SYSTEM
+static int
+map_w32_to_errno (DWORD w32_err)
+{
+ switch (w32_err)
+ {
+ case 0:
+ return 0;
+
+ case ERROR_FILE_NOT_FOUND:
+ return ENOENT;
+
+ case ERROR_PATH_NOT_FOUND:
+ return ENOENT;
+
+ case ERROR_ACCESS_DENIED:
+ return EPERM;
+
+ case ERROR_INVALID_HANDLE:
+ case ERROR_INVALID_BLOCK:
+ return EINVAL;
+
+ case ERROR_NOT_ENOUGH_MEMORY:
+ return ENOMEM;
+
+ case ERROR_NO_DATA:
+ return EPIPE;
+
+ default:
+ return EIO;
+ }
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+/*
+ * Replacement for a missing memrchr.
+ */
+#ifndef HAVE_MEMRCHR
+static void *
+memrchr (const void *buffer, int c, size_t n)
+{
+ const unsigned char *p = buffer;
+
+ for (p += n; n ; n--)
+ if (*--p == c)
+ return (void *)p;
+ return NULL;
+}
+#endif /*HAVE_MEMRCHR*/
+
+
+
+/*
+ * Wrappers to lock a stream or the list of streams.
+ */
+#if 0
+# define dbg_lock_0(f) fprintf (stderr, "estream: " f);
+# define dbg_lock_1(f, a) fprintf (stderr, "estream: " f, (a));
+# define dbg_lock_2(f, a, b) fprintf (stderr, "estream: " f, (a), (b));
+#else
+# define dbg_lock_0(f)
+# define dbg_lock_1(f, a)
+# define dbg_lock_2(f, a, b)
+#endif
+
+static int
+init_stream_lock (estream_t _GPGRT__RESTRICT stream)
+{
+ int rc;
+
+ if (!stream->intern->samethread)
+ {
+ dbg_lock_1 ("enter init_stream_lock for %p\n", stream);
+ memset (&stream->intern->lock, 0 , sizeof stream->intern->lock);
+ rc = _gpgrt_lock_init (&stream->intern->lock);
+ dbg_lock_2 ("leave init_stream_lock for %p: rc=%d\n", stream, rc);
+ }
+ else
+ rc = 0;
+ return rc;
+}
+
+
+static void
+destroy_stream_lock (estream_t _GPGRT__RESTRICT stream)
+{
+ if (!stream->intern->samethread)
+ {
+ dbg_lock_1 ("enter destroy_stream_lock for %p\n", stream);
+ _gpgrt_lock_destroy (&stream->intern->lock);
+ dbg_lock_1 ("leave destroy_stream_lock for %p\n", stream);
+ }
+}
+
+
+static void
+lock_stream (estream_t _GPGRT__RESTRICT stream)
+{
+ if (!stream->intern->samethread)
+ {
+ dbg_lock_1 ("enter lock_stream for %p\n", stream);
+ _gpgrt_lock_lock (&stream->intern->lock);
+ dbg_lock_1 ("leave lock_stream for %p\n", stream);
+ }
+}
+
+
+static int
+trylock_stream (estream_t _GPGRT__RESTRICT stream)
+{
+ int rc;
+
+ if (!stream->intern->samethread)
+ {
+ dbg_lock_1 ("enter trylock_stream for %p\n", stream);
+ rc = _gpgrt_lock_trylock (&stream->intern->lock)? 0 : -1;
+ dbg_lock_2 ("leave trylock_stream for %p: rc=%d\n", stream, rc);
+ }
+ else
+ rc = 0;
+ return rc;
+}
+
+
+static void
+unlock_stream (estream_t _GPGRT__RESTRICT stream)
+{
+ if (!stream->intern->samethread)
+ {
+ dbg_lock_1 ("enter unlock_stream for %p\n", stream);
+ _gpgrt_lock_unlock (&stream->intern->lock);
+ dbg_lock_1 ("leave unlock_stream for %p\n", stream);
+ }
+}
+
+
+static void
+lock_list (void)
+{
+ dbg_lock_0 ("enter lock_list\n");
+ _gpgrt_lock_lock (&estream_list_lock);
+ dbg_lock_0 ("leave lock_list\n");
+}
+
+
+static void
+unlock_list (void)
+{
+ dbg_lock_0 ("enter unlock_list\n");
+ _gpgrt_lock_unlock (&estream_list_lock);
+ dbg_lock_0 ("leave unlock_list\n");
+}
+
+
+#undef dbg_lock_0
+#undef dbg_lock_1
+#undef dbg_lock_2
+
+
+
+/*
+ * Manipulation of the list of stream.
+ */
+
+/*
+ * Add STREAM to the list of registered stream objects. If
+ * WITH_LOCKED_LIST is true it is assumed that the list of streams is
+ * already locked. The implementation is straightforward: We first
+ * look for an unused entry in the list and use that; if none is
+ * available we put a new item at the head. We drawback of the
+ * strategy never to shorten the list is that a one time allocation of
+ * many streams will lead to scanning unused entries later. If that
+ * turns out to be a problem, we may either free some items from the
+ * list or append new entries at the end; or use a table. Returns 0
+ * on success; on error or non-zero is returned and ERRNO set.
+ */
+static int
+do_list_add (estream_t stream, int with_locked_list)
+{
+ estream_list_t item;
+
+ if (!with_locked_list)
+ lock_list ();
+
+ for (item = estream_list; item && item->stream; item = item->next)
+ ;
+ if (!item)
+ {
+ item = mem_alloc (sizeof *item);
+ if (item)
+ {
+ item->next = estream_list;
+ estream_list = item;
+ }
+ }
+ if (item)
+ item->stream = stream;
+
+ if (!with_locked_list)
+ unlock_list ();
+
+ return item? 0 : -1;
+}
+
+/*
+ * Remove STREAM from the list of registered stream objects.
+ */
+static void
+do_list_remove (estream_t stream, int with_locked_list)
+{
+ estream_list_t item;
+
+ if (!with_locked_list)
+ lock_list ();
+
+ for (item = estream_list; item; item = item->next)
+ if (item->stream == stream)
+ {
+ item->stream = NULL;
+ break;
+ }
+
+ if (!with_locked_list)
+ unlock_list ();
+}
+
+
+
+/*
+ * The atexit handler for this estream module.
+ */
+static void
+do_deinit (void)
+{
+ /* Flush all streams. */
+ _gpgrt_fflush (NULL);
+
+ /* We should release the estream_list. However there is one
+ problem: That list is also used to search for the standard
+ estream file descriptors. If we would remove the entire list,
+ any use of es_foo in another atexit function may re-create the
+ list and the streams with possible undesirable effects. Given
+ that we don't close the stream either, it should not matter that
+ we keep the list and let the OS clean it up at process end. */
+
+ /* Reset the syscall clamp. */
+ pre_syscall_func = NULL;
+ post_syscall_func = NULL;
+ _gpgrt_thread_set_syscall_clamp (NULL, NULL);
+ _gpgrt_lock_set_lock_clamp (NULL, NULL);
+}
+
+
+/*
+ * Initialization of the estream module.
+ */
+int
+_gpgrt_estream_init (void)
+{
+ static int initialized;
+
+ if (!initialized)
+ {
+ initialized = 1;
+ atexit (do_deinit);
+ }
+ return 0;
+}
+
+/*
+ * Register the syscall clamp. These two functions are called
+ * immediately before and after a possible blocking system call. This
+ * should be used before any I/O happens. The function is commonly
+ * used with the nPth library:
+ *
+ * gpgrt_set_syscall_clamp (npth_unprotect, npth_protect);
+ *
+ * These functions may not modify ERRNO.
+ */
+void
+_gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_syscall_func = pre;
+ post_syscall_func = post;
+ _gpgrt_thread_set_syscall_clamp (pre, post);
+ _gpgrt_lock_set_lock_clamp (pre, post);
+}
+
+/*
+ * Return the current sycall clamp functions. This can be used by
+ * other libraries which have blocking functions.
+ */
+void
+_gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void))
+{
+ *r_pre = pre_syscall_func;
+ *r_post = post_syscall_func;
+}
+
+
+
+/*
+ * Implementation of memory based I/O.
+ */
+
+/* Cookie for memory objects. */
+typedef struct estream_cookie_mem
+{
+ unsigned int modeflags; /* Open flags. */
+ unsigned char *memory; /* Allocated data buffer. */
+ size_t memory_size; /* Allocated size of MEMORY. */
+ size_t memory_limit; /* Caller supplied maximum allowed
+ allocation size or 0 for no limit. */
+ size_t offset; /* Current offset in MEMORY. */
+ size_t data_len; /* Used length of data in MEMORY. */
+ size_t block_size; /* Block size. */
+ struct {
+ unsigned int grow: 1; /* MEMORY is allowed to grow. */
+ } flags;
+ func_realloc_t func_realloc;
+ func_free_t func_free;
+} *estream_cookie_mem_t;
+
+
+/*
+ * Create function for memory objects. DATA is either NULL or a user
+ * supplied buffer with the initial conetnt of the memory buffer. If
+ * DATA is NULL, DATA_N and DATA_LEN need to be 0 as well. If DATA is
+ * not NULL, DATA_N gives the allocated size of DATA and DATA_LEN the
+ * used length in DATA. If this function succeeds DATA is now owned
+ * by this function. If GROW is false FUNC_REALLOC is not
+ * required.
+ */
+static int
+func_mem_create (void *_GPGRT__RESTRICT *_GPGRT__RESTRICT cookie,
+ unsigned char *_GPGRT__RESTRICT data, size_t data_n,
+ size_t data_len,
+ size_t block_size, unsigned int grow,
+ func_realloc_t func_realloc, func_free_t func_free,
+ unsigned int modeflags,
+ size_t memory_limit)
+{
+ estream_cookie_mem_t mem_cookie;
+ int err;
+
+ if (!data && (data_n || data_len))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ if (grow && func_free && !func_realloc)
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+
+ /* Round a memory limit up to the next block length. */
+ if (memory_limit && block_size)
+ {
+ memory_limit += block_size - 1;
+ memory_limit /= block_size;
+ memory_limit *= block_size;
+ }
+
+ mem_cookie = mem_alloc (sizeof (*mem_cookie));
+ if (!mem_cookie)
+ err = -1;
+ else
+ {
+ mem_cookie->modeflags = modeflags;
+ mem_cookie->memory = data;
+ mem_cookie->memory_size = data_n;
+ mem_cookie->memory_limit = memory_limit;
+ mem_cookie->offset = 0;
+ mem_cookie->data_len = data_len;
+ mem_cookie->block_size = block_size;
+ mem_cookie->flags.grow = !!grow;
+ mem_cookie->func_realloc
+ = grow? (func_realloc ? func_realloc : mem_realloc) : NULL;
+ mem_cookie->func_free = func_free ? func_free : mem_free;
+ *cookie = mem_cookie;
+ err = 0;
+ }
+
+ return err;
+}
+
+
+/*
+ * Read function for memory objects.
+ */
+static gpgrt_ssize_t
+func_mem_read (void *cookie, void *buffer, size_t size)
+{
+ estream_cookie_mem_t mem_cookie = cookie;
+ gpgrt_ssize_t ret;
+
+ if (!size) /* Just the pending data check. */
+ return (mem_cookie->data_len - mem_cookie->offset)? 0 : -1;
+
+ if (size > mem_cookie->data_len - mem_cookie->offset)
+ size = mem_cookie->data_len - mem_cookie->offset;
+
+ if (size)
+ {
+ memcpy (buffer, mem_cookie->memory + mem_cookie->offset, size);
+ mem_cookie->offset += size;
+ }
+
+ ret = size;
+ return ret;
+}
+
+
+/*
+ * Write function for memory objects.
+ */
+static gpgrt_ssize_t
+func_mem_write (void *cookie, const void *buffer, size_t size)
+{
+ estream_cookie_mem_t mem_cookie = cookie;
+ gpgrt_ssize_t ret;
+ size_t nleft;
+
+ if (!size)
+ return 0; /* A flush is a NOP for memory objects. */
+
+ if (mem_cookie->modeflags & O_APPEND)
+ {
+ /* Append to data. */
+ mem_cookie->offset = mem_cookie->data_len;
+ }
+
+ assert (mem_cookie->memory_size >= mem_cookie->offset);
+ nleft = mem_cookie->memory_size - mem_cookie->offset;
+
+ /* If we are not allowed to grow the buffer, limit the size to the
+ left space. */
+ if (!mem_cookie->flags.grow && size > nleft)
+ size = nleft;
+
+ /* Enlarge the memory buffer if needed. */
+ if (size > nleft)
+ {
+ unsigned char *newbuf;
+ size_t newsize;
+
+ if (!mem_cookie->memory_size)
+ newsize = size; /* Not yet allocated. */
+ else
+ newsize = mem_cookie->memory_size + (size - nleft);
+ if (newsize < mem_cookie->offset)
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+
+ /* Round up to the next block length. BLOCK_SIZE should always
+ be set; we check anyway. */
+ if (mem_cookie->block_size)
+ {
+ newsize += mem_cookie->block_size - 1;
+ if (newsize < mem_cookie->offset)
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ newsize /= mem_cookie->block_size;
+ newsize *= mem_cookie->block_size;
+ }
+
+ /* Check for a total limit. */
+ if (mem_cookie->memory_limit && newsize > mem_cookie->memory_limit)
+ {
+ _set_errno (ENOSPC);
+ return -1;
+ }
+
+ assert (mem_cookie->func_realloc);
+ newbuf = mem_cookie->func_realloc (mem_cookie->memory, newsize);
+ if (!newbuf)
+ return -1;
+
+ mem_cookie->memory = newbuf;
+ mem_cookie->memory_size = newsize;
+
+ assert (mem_cookie->memory_size >= mem_cookie->offset);
+ nleft = mem_cookie->memory_size - mem_cookie->offset;
+
+ assert (size <= nleft);
+ }
+
+ memcpy (mem_cookie->memory + mem_cookie->offset, buffer, size);
+ if (mem_cookie->offset + size > mem_cookie->data_len)
+ mem_cookie->data_len = mem_cookie->offset + size;
+ mem_cookie->offset += size;
+
+ ret = size;
+ return ret;
+}
+
+
+/*
+ * Seek function for memory objects.
+ */
+static int
+func_mem_seek (void *cookie, gpgrt_off_t *offset, int whence)
+{
+ estream_cookie_mem_t mem_cookie = cookie;
+ gpgrt_off_t pos_new;
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ pos_new = *offset;
+ break;
+
+ case SEEK_CUR:
+ pos_new = mem_cookie->offset += *offset;
+ break;
+
+ case SEEK_END:
+ pos_new = mem_cookie->data_len += *offset;
+ break;
+
+ default:
+ _set_errno (EINVAL);
+ return -1;
+ }
+
+ if (pos_new > mem_cookie->memory_size)
+ {
+ size_t newsize;
+ void *newbuf;
+
+ if (!mem_cookie->flags.grow)
+ {
+ _set_errno (ENOSPC);
+ return -1;
+ }
+
+ newsize = pos_new + mem_cookie->block_size - 1;
+ if (newsize < pos_new)
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ newsize /= mem_cookie->block_size;
+ newsize *= mem_cookie->block_size;
+
+ if (mem_cookie->memory_limit && newsize > mem_cookie->memory_limit)
+ {
+ _set_errno (ENOSPC);
+ return -1;
+ }
+
+ assert (mem_cookie->func_realloc);
+ newbuf = mem_cookie->func_realloc (mem_cookie->memory, newsize);
+ if (!newbuf)
+ return -1;
+
+ mem_cookie->memory = newbuf;
+ mem_cookie->memory_size = newsize;
+ }
+
+ if (pos_new > mem_cookie->data_len)
+ {
+ /* Fill spare space with zeroes. */
+ memset (mem_cookie->memory + mem_cookie->data_len,
+ 0, pos_new - mem_cookie->data_len);
+ mem_cookie->data_len = pos_new;
+ }
+
+ mem_cookie->offset = pos_new;
+ *offset = pos_new;
+
+ return 0;
+}
+
+
+/*
+ * The IOCTL function for memory objects.
+ */
+static int
+func_mem_ioctl (void *cookie, int cmd, void *ptr, size_t *len)
+{
+ estream_cookie_mem_t mem_cookie = cookie;
+ int ret;
+
+ if (cmd == COOKIE_IOCTL_SNATCH_BUFFER)
+ {
+ /* Return the internal buffer of the stream to the caller and
+ invalidate it for the stream. */
+ *(void**)ptr = mem_cookie->memory;
+ *len = mem_cookie->data_len;
+ mem_cookie->memory = NULL;
+ mem_cookie->memory_size = 0;
+ mem_cookie->offset = 0;
+ ret = 0;
+ }
+ else
+ {
+ _set_errno (EINVAL);
+ ret = -1;
+ }
+
+ return ret;
+}
+
+
+/*
+ * The destroy function for memory objects.
+ */
+static int
+func_mem_destroy (void *cookie)
+{
+ estream_cookie_mem_t mem_cookie = cookie;
+
+ if (cookie)
+ {
+ mem_cookie->func_free (mem_cookie->memory);
+ mem_free (mem_cookie);
+ }
+ return 0;
+}
+
+/*
+ * Access object for the memory functions.
+ */
+static struct cookie_io_functions_s estream_functions_mem =
+ {
+ {
+ func_mem_read,
+ func_mem_write,
+ func_mem_seek,
+ func_mem_destroy,
+ },
+ func_mem_ioctl,
+ };
+
+
+
+/*
+ * Implementation of file descriptor based I/O.
+ */
+
+/* Cookie for fd objects. */
+typedef struct estream_cookie_fd
+{
+ int fd; /* The file descriptor we are using for actual output. */
+ int no_close; /* If set we won't close the file descriptor. */
+ int nonblock; /* Non-blocking mode is enabled. */
+} *estream_cookie_fd_t;
+
+
+/*
+ * Create function for objects indentified by a libc file descriptor.
+ */
+static int
+func_fd_create (void **cookie, int fd, unsigned int modeflags, int no_close)
+{
+ estream_cookie_fd_t fd_cookie;
+ int err;
+
+ trace (("enter: fd=%d mf=%x nc=%d", fd, modeflags, no_close));
+
+ fd_cookie = mem_alloc (sizeof (*fd_cookie));
+ if (! fd_cookie)
+ err = -1;
+ else
+ {
+#ifdef HAVE_DOSISH_SYSTEM
+ /* Make sure it is in binary mode if requested. */
+ if ( (modeflags & O_BINARY) )
+ setmode (fd, O_BINARY);
+#endif
+ fd_cookie->fd = fd;
+ fd_cookie->no_close = no_close;
+ fd_cookie->nonblock = !!(modeflags & O_NONBLOCK);
+ *cookie = fd_cookie;
+ err = 0;
+ }
+
+ trace_errno (err, ("leave: cookie=%p err=%d", *cookie, err));
+ return err;
+}
+
+
+/*
+ * Read function for fd objects.
+ */
+static gpgrt_ssize_t
+func_fd_read (void *cookie, void *buffer, size_t size)
+
+{
+ estream_cookie_fd_t file_cookie = cookie;
+ gpgrt_ssize_t bytes_read;
+
+ trace (("enter: cookie=%p buffer=%p size=%d", cookie, buffer, (int)size));
+
+ if (!size)
+ bytes_read = -1; /* We don't know whether anything is pending. */
+ else if (IS_INVALID_FD (file_cookie->fd))
+ {
+ _gpgrt_yield ();
+ bytes_read = 0;
+ }
+ else
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ do
+ {
+ bytes_read = read (file_cookie->fd, buffer, size);
+ }
+ while (bytes_read == -1 && errno == EINTR);
+ if (post_syscall_func)
+ post_syscall_func ();
+ }
+
+ trace_errno (bytes_read == -1, ("leave: bytes_read=%d", (int)bytes_read));
+ return bytes_read;
+}
+
+
+/*
+ * Write function for fd objects.
+ */
+static gpgrt_ssize_t
+func_fd_write (void *cookie, const void *buffer, size_t size)
+{
+ estream_cookie_fd_t file_cookie = cookie;
+ gpgrt_ssize_t bytes_written;
+
+ trace (("enter: cookie=%p buffer=%p size=%d", cookie, buffer, (int)size));
+
+ if (IS_INVALID_FD (file_cookie->fd))
+ {
+ _gpgrt_yield ();
+ bytes_written = size; /* Yeah: Success writing to the bit bucket. */
+ }
+ else if (buffer)
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ do
+ {
+ bytes_written = write (file_cookie->fd, buffer, size);
+ }
+ while (bytes_written == -1 && errno == EINTR);
+ if (post_syscall_func)
+ post_syscall_func ();
+ }
+ else
+ bytes_written = size; /* Note that for a flush SIZE should be 0. */
+
+ trace_errno (bytes_written == -1,
+ ("leave: bytes_written=%d", (int)bytes_written));
+ return bytes_written;
+}
+
+
+/*
+ * Seek function for fd objects.
+ */
+static int
+func_fd_seek (void *cookie, gpgrt_off_t *offset, int whence)
+{
+ estream_cookie_fd_t file_cookie = cookie;
+ gpgrt_off_t offset_new;
+ int err;
+
+ if (IS_INVALID_FD (file_cookie->fd))
+ {
+ _set_errno (ESPIPE);
+ err = -1;
+ }
+ else
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ offset_new = lseek (file_cookie->fd, *offset, whence);
+ if (post_syscall_func)
+ post_syscall_func ();
+ if (offset_new == -1)
+ err = -1;
+ else
+ {
+ *offset = offset_new;
+ err = 0;
+ }
+ }
+
+ return err;
+}
+
+
+/*
+ * The IOCTL function for fd objects.
+ */
+static int
+func_fd_ioctl (void *cookie, int cmd, void *ptr, size_t *len)
+{
+ estream_cookie_fd_t fd_cookie = cookie;
+ int ret;
+
+ if (cmd == COOKIE_IOCTL_NONBLOCK && !len)
+ {
+ fd_cookie->nonblock = !!ptr;
+ if (IS_INVALID_FD (fd_cookie->fd))
+ {
+ _set_errno (EINVAL);
+ ret = -1;
+ }
+ else
+ {
+#ifdef _WIN32
+ _set_errno (EOPNOTSUPP); /* FIXME: Implement for Windows. */
+ ret = -1;
+#else
+ _set_errno (0);
+ ret = fcntl (fd_cookie->fd, F_GETFL, 0);
+ if (ret == -1 && errno)
+ ;
+ else if (fd_cookie->nonblock)
+ ret = fcntl (fd_cookie->fd, F_SETFL, (ret | O_NONBLOCK));
+ else
+ ret = fcntl (fd_cookie->fd, F_SETFL, (ret & ~O_NONBLOCK));
+#endif
+ }
+ }
+ else
+ {
+ _set_errno (EINVAL);
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/*
+ * The destroy function for fd objects.
+ */
+static int
+func_fd_destroy (void *cookie)
+{
+ estream_cookie_fd_t fd_cookie = cookie;
+ int err;
+
+ trace (("enter: cookie=%p", cookie));
+
+ if (fd_cookie)
+ {
+ if (IS_INVALID_FD (fd_cookie->fd))
+ err = 0;
+ else
+ err = fd_cookie->no_close? 0 : close (fd_cookie->fd);
+ mem_free (fd_cookie);
+ }
+ else
+ err = 0;
+
+ trace_errno (err,("leave: err=%d", err));
+ return err;
+}
+
+
+/*
+ * Access object for the fd functions.
+ */
+static struct cookie_io_functions_s estream_functions_fd =
+ {
+ {
+ func_fd_read,
+ func_fd_write,
+ func_fd_seek,
+ func_fd_destroy,
+ },
+ func_fd_ioctl,
+ };
+
+
+
+
+/*
+ * Implementation of W32 handle based I/O.
+ */
+#ifdef HAVE_W32_SYSTEM
+
+/* Cookie for fd objects. */
+typedef struct estream_cookie_w32
+{
+ HANDLE hd; /* The handle we are using for actual output. */
+ int no_close; /* If set we won't close the handle. */
+ int no_syscall_clamp; /* Do not use the syscall clamp. */
+} *estream_cookie_w32_t;
+
+
+/*
+ * Create function for w32 handle objects.
+ */
+static int
+func_w32_create (void **cookie, HANDLE hd,
+ unsigned int modeflags, int no_close, int no_syscall_clamp)
+{
+ estream_cookie_w32_t w32_cookie;
+ int err;
+
+ trace (("enter: hd=%p mf=%x nc=%d nsc=%d",
+ hd, modeflags, no_close, no_syscall_clamp));
+ w32_cookie = mem_alloc (sizeof (*w32_cookie));
+ if (!w32_cookie)
+ err = -1;
+ else
+ {
+ /* CR/LF translations are not supported when using the bare W32
+ API. If that is really required we need to implemented that
+ in the upper layer. */
+ (void)modeflags;
+
+ w32_cookie->hd = hd;
+ w32_cookie->no_close = no_close;
+ w32_cookie->no_syscall_clamp = no_syscall_clamp;
+ *cookie = w32_cookie;
+ err = 0;
+ }
+
+ trace_errno (err, ("leave: cookie=%p err=%d", *cookie, err));
+ return err;
+}
+
+/*
+ * Read function for W32 handle objects.
+ *
+ * Note that this function may also be used by the reader thread of
+ * w32-stream. In that case the NO_SYSCALL_CLAMP is set.
+ */
+static gpgrt_ssize_t
+func_w32_read (void *cookie, void *buffer, size_t size)
+{
+ estream_cookie_w32_t w32_cookie = cookie;
+ gpgrt_ssize_t bytes_read;
+
+ trace (("enter: cookie=%p buffer=%p size=%d", cookie, buffer, (int)size));
+
+ if (!size)
+ bytes_read = -1; /* We don't know whether anything is pending. */
+ else if (w32_cookie->hd == INVALID_HANDLE_VALUE)
+ {
+ _gpgrt_yield ();
+ bytes_read = 0;
+ }
+ else
+ {
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
+ pre_syscall_func ();
+ do
+ {
+ DWORD nread, ec;
+
+ trace (("cookie=%p calling ReadFile", cookie));
+ if (!ReadFile (w32_cookie->hd, buffer, size, &nread, NULL))
+ {
+ ec = GetLastError ();
+ trace (("cookie=%p ReadFile failed: ec=%ld", cookie,ec));
+ if (ec == ERROR_BROKEN_PIPE)
+ bytes_read = 0; /* Like our pth_read we handle this as EOF. */
+ else
+ {
+ _set_errno (map_w32_to_errno (ec));
+ bytes_read = -1;
+ }
+ }
+ else
+ bytes_read = (int)nread;
+ }
+ while (bytes_read == -1 && errno == EINTR);
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
+ post_syscall_func ();
+ }
+
+ trace_errno (bytes_read==-1,("leave: bytes_read=%d", (int)bytes_read));
+ return bytes_read;
+}
+
+
+/*
+ * Write function for W32 handle objects.
+ *
+ * Note that this function may also be used by the writer thread of
+ * w32-stream. In that case the NO_SYSCALL_CLAMP is set.
+ */
+static gpgrt_ssize_t
+func_w32_write (void *cookie, const void *buffer, size_t size)
+{
+ estream_cookie_w32_t w32_cookie = cookie;
+ gpgrt_ssize_t bytes_written;
+
+ trace (("enter: cookie=%p buffer=%p size=%d", cookie, buffer, (int)size));
+
+ if (w32_cookie->hd == INVALID_HANDLE_VALUE)
+ {
+ _gpgrt_yield ();
+ bytes_written = size; /* Yeah: Success writing to the bit bucket. */
+ }
+ else if (buffer)
+ {
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
+ pre_syscall_func ();
+ do
+ {
+ DWORD nwritten;
+
+ trace (("cookie=%p calling WriteFile", cookie));
+ if (!WriteFile (w32_cookie->hd, buffer, size, &nwritten, NULL))
+ {
+ DWORD ec = GetLastError ();
+ trace (("cookie=%p WriteFile failed: ec=%ld", cookie, ec));
+ _set_errno (map_w32_to_errno (ec));
+ bytes_written = -1;
+ }
+ else
+ bytes_written = (int)nwritten;
+ }
+ while (bytes_written == -1 && errno == EINTR);
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
+ post_syscall_func ();
+ }
+ else
+ bytes_written = size; /* Note that for a flush SIZE should be 0. */
+
+ trace_errno (bytes_written==-1,
+ ("leave: bytes_written=%d", (int)bytes_written));
+ return bytes_written;
+}
+
+
+/*
+ * Seek function for W32 handle objects.
+ */
+static int
+func_w32_seek (void *cookie, gpgrt_off_t *offset, int whence)
+{
+ estream_cookie_w32_t w32_cookie = cookie;
+ DWORD method;
+ LARGE_INTEGER distance, newoff;
+
+ if (w32_cookie->hd == INVALID_HANDLE_VALUE)
+ {
+ _set_errno (ESPIPE);
+ return -1;
+ }
+
+ if (whence == SEEK_SET)
+ {
+ method = FILE_BEGIN;
+ distance.QuadPart = (unsigned long long)(*offset);
+ }
+ else if (whence == SEEK_CUR)
+ {
+ method = FILE_CURRENT;
+ distance.QuadPart = (long long)(*offset);
+ }
+ else if (whence == SEEK_END)
+ {
+ method = FILE_END;
+ distance.QuadPart = (long long)(*offset);
+ }
+ else
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+#ifdef HAVE_W32CE_SYSTEM
+# warning need to use SetFilePointer
+#else
+ if (pre_syscall_func && !w32_cookie->no_syscall_clamp)
+ pre_syscall_func ();
+ if (!SetFilePointerEx (w32_cookie->hd, distance, &newoff, method))
+ {
+ _set_errno (map_w32_to_errno (GetLastError ()));
+ if (post_syscall_func)
+ post_syscall_func ();
+ return -1;
+ }
+ if (post_syscall_func && !w32_cookie->no_syscall_clamp)
+ post_syscall_func ();
+#endif
+ /* Note that gpgrt_off_t is always 64 bit. */
+ *offset = (gpgrt_off_t)newoff.QuadPart;
+ return 0;
+}
+
+
+/*
+ * Destroy function for W32 handle objects.
+ */
+static int
+func_w32_destroy (void *cookie)
+{
+ estream_cookie_w32_t w32_cookie = cookie;
+ int err;
+
+ trace (("enter: cookie=%p", cookie));
+
+ if (w32_cookie)
+ {
+ if (w32_cookie->hd == INVALID_HANDLE_VALUE)
+ err = 0;
+ else if (w32_cookie->no_close)
+ err = 0;
+ else
+ {
+ trace (("cookie=%p closing handle %p", cookie, w32_cookie->hd));
+ if (!CloseHandle (w32_cookie->hd))
+ {
+ DWORD ec = GetLastError ();
+ trace (("cookie=%p CloseHandle failed: ec=%ld", cookie,ec));
+ _set_errno (map_w32_to_errno (ec));
+ err = -1;
+ }
+ else
+ err = 0;
+ }
+ mem_free (w32_cookie);
+ }
+ else
+ err = 0;
+
+ trace_errno (err, ("leave: err=%d", err));
+ return err;
+}
+
+
+/*
+ * Access object for the W32 handle based objects.
+ */
+static struct cookie_io_functions_s estream_functions_w32 =
+ {
+ {
+ func_w32_read,
+ func_w32_write,
+ func_w32_seek,
+ func_w32_destroy,
+ },
+ NULL,
+ };
+#endif /*HAVE_W32_SYSTEM*/
+
+
+
+
+/*
+ * Implementation of stdio based I/O.
+ */
+
+/* Cookie for fp objects. */
+typedef struct estream_cookie_fp
+{
+ FILE *fp; /* The file pointer we are using for actual output. */
+ int no_close; /* If set we won't close the file pointer. */
+} *estream_cookie_fp_t;
+
+
+/*
+ * Create function for stdio based objects.
+ */
+static int
+func_fp_create (void **cookie, FILE *fp,
+ unsigned int modeflags, int no_close)
+{
+ estream_cookie_fp_t fp_cookie;
+ int err;
+
+ fp_cookie = mem_alloc (sizeof *fp_cookie);
+ if (!fp_cookie)
+ err = -1;
+ else
+ {
+#ifdef HAVE_DOSISH_SYSTEM
+ /* Make sure it is in binary mode if requested. */
+ if ( (modeflags & O_BINARY) )
+ setmode (fileno (fp), O_BINARY);
+#else
+ (void)modeflags;
+#endif
+ fp_cookie->fp = fp;
+ fp_cookie->no_close = no_close;
+ *cookie = fp_cookie;
+ err = 0;
+ }
+
+ return err;
+}
+
+
+/*
+ * Read function for stdio based objects.
+ */
+static gpgrt_ssize_t
+func_fp_read (void *cookie, void *buffer, size_t size)
+
+{
+ estream_cookie_fp_t file_cookie = cookie;
+ gpgrt_ssize_t bytes_read;
+
+ if (!size)
+ return -1; /* We don't know whether anything is pending. */
+
+ if (file_cookie->fp)
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ bytes_read = fread (buffer, 1, size, file_cookie->fp);
+ if (post_syscall_func)
+ post_syscall_func ();
+ }
+ else
+ bytes_read = 0;
+ if (!bytes_read && ferror (file_cookie->fp))
+ return -1;
+ return bytes_read;
+}
+
+
+/*
+ * Write function for stdio bases objects.
+ */
+static gpgrt_ssize_t
+func_fp_write (void *cookie, const void *buffer, size_t size)
+{
+ estream_cookie_fp_t file_cookie = cookie;
+ size_t bytes_written;
+
+ if (file_cookie->fp)
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ if (buffer)
+ {
+#ifdef HAVE_W32_SYSTEM
+ /* Using an fwrite to stdout connected to the console fails
+ with the error "Not enough space" for an fwrite size of
+ >= 52KB (tested on Windows XP SP2). To solve this we
+ always chunk the writes up into smaller blocks. */
+ bytes_written = 0;
+ while (bytes_written < size)
+ {
+ size_t cnt = size - bytes_written;
+
+ if (cnt > 32*1024)
+ cnt = 32*1024;
+ if (fwrite ((const char*)buffer + bytes_written,
+ cnt, 1, file_cookie->fp) != 1)
+ break; /* Write error. */
+ bytes_written += cnt;
+ }
+#else
+ bytes_written = fwrite (buffer, 1, size, file_cookie->fp);
+#endif
+ }
+ else /* Only flush requested. */
+ bytes_written = size;
+
+ fflush (file_cookie->fp);
+ if (post_syscall_func)
+ post_syscall_func ();
+ }
+ else
+ bytes_written = size; /* Successfully written to the bit bucket. */
+
+ if (bytes_written != size)
+ return -1;
+ return bytes_written;
+}
+
+
+/*
+ * Seek function for stdio based objects.
+ */
+static int
+func_fp_seek (void *cookie, gpgrt_off_t *offset, int whence)
+{
+ estream_cookie_fp_t file_cookie = cookie;
+ long int offset_new;
+
+ if (!file_cookie->fp)
+ {
+ _set_errno (ESPIPE);
+ return -1;
+ }
+
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ if ( fseek (file_cookie->fp, (long int)*offset, whence) )
+ {
+ /* fprintf (stderr, "\nfseek failed: errno=%d (%s)\n", */
+ /* errno,strerror (errno)); */
+ if (post_syscall_func)
+ post_syscall_func ();
+ return -1;
+ }
+
+ offset_new = ftell (file_cookie->fp);
+ if (post_syscall_func)
+ post_syscall_func ();
+ if (offset_new == -1)
+ {
+ /* fprintf (stderr, "\nftell failed: errno=%d (%s)\n", */
+ /* errno,strerror (errno)); */
+ return -1;
+ }
+ *offset = offset_new;
+ return 0;
+}
+
+
+/*
+ * Destroy function for stdio based objects.
+ */
+static int
+func_fp_destroy (void *cookie)
+{
+ estream_cookie_fp_t fp_cookie = cookie;
+ int err;
+
+ if (fp_cookie)
+ {
+ if (fp_cookie->fp)
+ {
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ fflush (fp_cookie->fp);
+ if (post_syscall_func)
+ post_syscall_func ();
+ err = fp_cookie->no_close? 0 : fclose (fp_cookie->fp);
+ }
+ else
+ err = 0;
+ mem_free (fp_cookie);
+ }
+ else
+ err = 0;
+
+ return err;
+}
+
+
+/*
+ * Access object for stdio based objects.
+ */
+static struct cookie_io_functions_s estream_functions_fp =
+ {
+ {
+ func_fp_read,
+ func_fp_write,
+ func_fp_seek,
+ func_fp_destroy,
+ },
+ NULL,
+ };
+
+
+
+
+/*
+ * Implementation of file name based I/O.
+ *
+ * Note that only a create function is required because the other
+ * operations ares handled by file descriptor based I/O.
+ */
+
+/* Create function for objects identified by a file name. */
+static int
+func_file_create (void **cookie, int *filedes,
+ const char *path, unsigned int modeflags, unsigned int cmode)
+{
+ estream_cookie_fd_t file_cookie;
+ int err;
+ int fd;
+
+ err = 0;
+
+ file_cookie = mem_alloc (sizeof (*file_cookie));
+ if (! file_cookie)
+ {
+ err = -1;
+ goto out;
+ }
+
+ fd = open (path, modeflags, cmode);
+ if (fd == -1)
+ {
+ err = -1;
+ goto out;
+ }
+#ifdef HAVE_DOSISH_SYSTEM
+ /* Make sure it is in binary mode if requested. */
+ if ( (modeflags & O_BINARY) )
+ setmode (fd, O_BINARY);
+#endif
+
+ file_cookie->fd = fd;
+ file_cookie->no_close = 0;
+ *cookie = file_cookie;
+ *filedes = fd;
+
+ out:
+
+ if (err)
+ mem_free (file_cookie);
+
+ return err;
+}
+
+
+
+/* Flags used by parse_mode and friends. */
+#define X_SAMETHREAD (1 << 0)
+#define X_SYSOPEN (1 << 1)
+#define X_POLLABLE (1 << 2)
+
+/* Parse the mode flags of fopen et al. In addition to the POSIX
+ * defined mode flags keyword parameters are supported. These are
+ * key/value pairs delimited by comma and optional white spaces.
+ * Keywords and values may not contain a comma or white space; unknown
+ * keywords are skipped. Supported keywords are:
+ *
+ * mode=<string>
+ *
+ * Creates a file and gives the new file read and write permissions
+ * for the user and read permission for the group. The format of
+ * the string is the same as shown by the -l option of the ls(1)
+ * command. However the first letter must be a dash and it is
+ * allowed to leave out trailing dashes. If this keyword parameter
+ * is not given the default mode for creating files is "-rw-rw-r--"
+ * (664). Note that the system still applies the current umask to
+ * the mode when crating a file. Example:
+ *
+ * "wb,mode=-rw-r--"
+ *
+ * samethread
+ *
+ * Assumes that the object is only used by the creating thread and
+ * disables any internal locking. This keyword is also found on
+ * IBM systems.
+ *
+ * nonblock
+ *
+ * The object is opened in non-blocking mode. This is the same as
+ * calling gpgrt_set_nonblock on the file.
+ *
+ * sysopen
+ *
+ * The object is opened in sysmode. On POSIX this is a NOP but
+ * under Windows the direct W32 API functions (HANDLE) are used
+ * instead of their libc counterparts (fd).
+ * FIXME: The functionality is not yet implemented.
+ *
+ * pollable
+ *
+ * The object is opened in a way suitable for use with es_poll. On
+ * POSIX this is a NOP but under Windows we create up to two
+ * threads, one for reading and one for writing, do any I/O there,
+ * and synchronize with them in order to support es_poll.
+ *
+ * Note: R_CMODE is optional because is only required by functions
+ * which are able to creat a file.
+ */
+static int
+parse_mode (const char *modestr,
+ unsigned int *modeflags,
+ unsigned int *r_xmode,
+ unsigned int *r_cmode)
+{
+ unsigned int omode, oflags, cmode;
+ int got_cmode = 0;
+
+ *r_xmode = 0;
+
+ switch (*modestr)
+ {
+ case 'r':
+ omode = O_RDONLY;
+ oflags = 0;
+ break;
+ case 'w':
+ omode = O_WRONLY;
+ oflags = O_TRUNC | O_CREAT;
+ break;
+ case 'a':
+ omode = O_WRONLY;
+ oflags = O_APPEND | O_CREAT;
+ break;
+ default:
+ _set_errno (EINVAL);
+ return -1;
+ }
+ for (modestr++; *modestr; modestr++)
+ {
+ switch (*modestr)
+ {
+ case '+':
+ omode = O_RDWR;
+ break;
+ case 'b':
+ oflags |= O_BINARY;
+ break;
+ case 'x':
+ oflags |= O_EXCL;
+ break;
+ case ',':
+ goto keyvalue;
+ default: /* Ignore unknown flags. */
+ break;
+ }
+ }
+
+ keyvalue:
+ /* Parse key/value pairs (similar to fopen on mainframes). */
+ for (cmode=0; *modestr == ','; modestr += strcspn (modestr, ","))
+ {
+ modestr++;
+ modestr += strspn (modestr, " \t");
+ if (!strncmp (modestr, "mode=", 5))
+ {
+ static struct {
+ char letter;
+ unsigned int value;
+ } table[] = { { '-', 0 },
+ { 'r', S_IRUSR }, { 'w', S_IWUSR }, { 'x', S_IXUSR },
+ { 'r', S_IRGRP }, { 'w', S_IWGRP }, { 'x', S_IXGRP },
+ { 'r', S_IROTH }, { 'w', S_IWOTH }, { 'x', S_IXOTH }};
+ int idx;
+
+ got_cmode = 1;
+ modestr += 5;
+ /* For now we only support a string as used by ls(1) and no
+ octal numbers. The first character must be a dash. */
+ for (idx=0; idx < 10 && *modestr; idx++, modestr++)
+ {
+ if (*modestr == table[idx].letter)
+ cmode |= table[idx].value;
+ else if (*modestr != '-')
+ break;
+ }
+ if (*modestr && !strchr (" \t,", *modestr))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ }
+ else if (!strncmp (modestr, "samethread", 10))
+ {
+ modestr += 10;
+ if (*modestr && !strchr (" \t,", *modestr))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ *r_xmode |= X_SAMETHREAD;
+ }
+ else if (!strncmp (modestr, "nonblock", 8))
+ {
+ modestr += 8;
+ if (*modestr && !strchr (" \t,", *modestr))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ oflags |= O_NONBLOCK;
+#if HAVE_W32_SYSTEM
+ /* Currently, nonblock implies pollable on Windows. */
+ *r_xmode |= X_POLLABLE;
+#endif
+ }
+ else if (!strncmp (modestr, "sysopen", 7))
+ {
+ modestr += 7;
+ if (*modestr && !strchr (" \t,", *modestr))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ *r_xmode |= X_SYSOPEN;
+ }
+ else if (!strncmp (modestr, "pollable", 8))
+ {
+ modestr += 8;
+ if (*modestr && !strchr (" \t,", *modestr))
+ {
+ _set_errno (EINVAL);
+ return -1;
+ }
+ *r_xmode |= X_POLLABLE;
+ }
+ }
+ if (!got_cmode)
+ cmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+
+ *modeflags = (omode | oflags);
+ if (r_cmode)
+ *r_cmode = cmode;
+ return 0;
+}
+
+
+
+/*
+ * Low level stream functionality.
+ */
+
+static int
+fill_stream (estream_t stream)
+{
+ size_t bytes_read = 0;
+ int err;
+
+ if (!stream->intern->func_read)
+ {
+ _set_errno (EOPNOTSUPP);
+ err = -1;
+ }
+ else if (!stream->buffer_size)
+ err = 0;
+ else
+ {
+ gpgrt_cookie_read_function_t func_read = stream->intern->func_read;
+ gpgrt_ssize_t ret;
+
+ ret = (*func_read) (stream->intern->cookie,
+ stream->buffer, stream->buffer_size);
+ if (ret == -1)
+ {
+ bytes_read = 0;
+ err = -1;
+#if EWOULDBLOCK != EAGAIN
+ if (errno == EWOULDBLOCK)
+ _set_errno (EAGAIN);
+#endif
+ }
+ else
+ {
+ bytes_read = ret;
+ err = 0;
+ }
+ }
+
+ if (err)
+ {
+ if (errno != EAGAIN)
+ {
+ if (errno == EPIPE)
+ stream->intern->indicators.hup = 1;
+ stream->intern->indicators.err = 1;
+ }
+ }
+ else if (!bytes_read)
+ stream->intern->indicators.eof = 1;
+
+ stream->intern->offset += stream->data_len;
+ stream->data_len = bytes_read;
+ stream->data_offset = 0;
+
+ return err;
+}
+
+static int
+flush_stream (estream_t stream)
+{
+ gpgrt_cookie_write_function_t func_write = stream->intern->func_write;
+ int err;
+
+ assert (stream->flags.writing);
+
+ if (stream->data_offset)
+ {
+ size_t bytes_written;
+ size_t data_flushed;
+ gpgrt_ssize_t ret;
+
+ if (! func_write)
+ {
+ _set_errno (EOPNOTSUPP);
+ err = -1;
+ goto out;
+ }
+
+ /* Note: to prevent an endless loop caused by user-provided
+ write-functions that pretend to have written more bytes than
+ they were asked to write, we have to check for
+ "(stream->data_offset - data_flushed) > 0" instead of
+ "stream->data_offset - data_flushed". */
+
+ data_flushed = 0;
+ err = 0;
+
+ while ((((gpgrt_ssize_t) (stream->data_offset - data_flushed)) > 0)
+ && !err)
+ {
+ ret = (*func_write) (stream->intern->cookie,
+ stream->buffer + data_flushed,
+ stream->data_offset - data_flushed);
+ if (ret == -1)
+ {
+ bytes_written = 0;
+ err = -1;
+#if EWOULDBLOCK != EAGAIN
+ if (errno == EWOULDBLOCK)
+ _set_errno (EAGAIN);
+#endif
+ }
+ else
+ bytes_written = ret;
+
+ data_flushed += bytes_written;
+ if (err)
+ break;
+ }
+
+ stream->data_flushed += data_flushed;
+ if (stream->data_offset == data_flushed)
+ {
+ stream->intern->offset += stream->data_offset;
+ stream->data_offset = 0;
+ stream->data_flushed = 0;
+
+ /* Propagate flush event. */
+ (*func_write) (stream->intern->cookie, NULL, 0);
+ }
+ }
+ else
+ err = 0;
+
+ out:
+
+ if (err && errno != EAGAIN)
+ {
+ if (errno == EPIPE)
+ stream->intern->indicators.hup = 1;
+ stream->intern->indicators.err = 1;
+ }
+
+ return err;
+}
+
+
+/*
+ * Discard buffered data for STREAM.
+ */
+static void
+es_empty (estream_t stream)
+{
+ assert (!stream->flags.writing);
+ stream->data_len = 0;
+ stream->data_offset = 0;
+ stream->unread_data_len = 0;
+}
+
+
+/*
+ * Initialize STREAM.
+ */
+static void
+init_stream_obj (estream_t stream,
+ void *cookie, es_syshd_t *syshd,
+ gpgrt_stream_backend_kind_t kind,
+ struct cookie_io_functions_s functions,
+ unsigned int modeflags, unsigned int xmode)
+{
+ stream->intern->kind = kind;
+ stream->intern->cookie = cookie;
+ stream->intern->opaque = NULL;
+ stream->intern->offset = 0;
+ stream->intern->func_read = functions.public.func_read;
+ stream->intern->func_write = functions.public.func_write;
+ stream->intern->func_seek = functions.public.func_seek;
+ stream->intern->func_ioctl = functions.func_ioctl;
+ stream->intern->func_close = functions.public.func_close;
+ stream->intern->strategy = _IOFBF;
+ stream->intern->syshd = *syshd;
+ stream->intern->print_ntotal = 0;
+ stream->intern->indicators.err = 0;
+ stream->intern->indicators.eof = 0;
+ stream->intern->indicators.hup = 0;
+ stream->intern->is_stdstream = 0;
+ stream->intern->stdstream_fd = 0;
+ stream->intern->deallocate_buffer = 0;
+ stream->intern->printable_fname = NULL;
+ stream->intern->printable_fname_inuse = 0;
+ stream->intern->samethread = !! (xmode & X_SAMETHREAD);
+ stream->intern->onclose = NULL;
+
+ stream->data_len = 0;
+ stream->data_offset = 0;
+ stream->data_flushed = 0;
+ stream->unread_data_len = 0;
+ /* Depending on the modeflags we set whether we start in writing or
+ reading mode. This is required in case we are working on a
+ stream which is not seeekable (like stdout). Without this
+ pre-initialization we would do a seek at the first write call and
+ as this will fail no output will be delivered. */
+ if ((modeflags & O_WRONLY) || (modeflags & O_RDWR) )
+ stream->flags.writing = 1;
+ else
+ stream->flags.writing = 0;
+}
+
+
+/*
+ * Deinitialize the STREAM object. This does _not_ free the memory,
+ * destroys the lock, or closes the underlying descriptor.
+ */
+static int
+deinit_stream_obj (estream_t stream)
+{
+ gpgrt_cookie_close_function_t func_close;
+ int err, tmp_err;
+
+ trace (("enter: stream %p", stream));
+ func_close = stream->intern->func_close;
+
+ err = 0;
+ if (stream->flags.writing)
+ {
+ tmp_err = flush_stream (stream);
+ if (!err)
+ err = tmp_err;
+ }
+ if (func_close)
+ {
+ trace (("stream %p calling func_close", stream));
+ tmp_err = func_close (stream->intern->cookie);
+ if (!err)
+ err = tmp_err;
+ }
+
+ mem_free (stream->intern->printable_fname);
+ stream->intern->printable_fname = NULL;
+ stream->intern->printable_fname_inuse = 0;
+ while (stream->intern->onclose)
+ {
+ notify_list_t tmp = stream->intern->onclose->next;
+ mem_free (stream->intern->onclose);
+ stream->intern->onclose = tmp;
+ }
+
+ trace_errno (err, ("leave: stream %p err=%d", stream, err));
+ return err;
+}
+
+
+/*
+ * Create a new stream and initialize it. On success the new stream
+ * handle is tsored at R_STREAM. On failure NULL is stored at
+ * R_STREAM.
+ */
+static int
+create_stream (estream_t *r_stream, void *cookie, es_syshd_t *syshd,
+ gpgrt_stream_backend_kind_t kind,
+ struct cookie_io_functions_s functions, unsigned int modeflags,
+ unsigned int xmode, int with_locked_list)
+{
+ estream_internal_t stream_internal_new;
+ estream_t stream_new;
+ int err;
+#if HAVE_W32_SYSTEM
+ void *old_cookie = NULL;
+#endif
+
+ stream_new = NULL;
+ stream_internal_new = NULL;
+
+#if HAVE_W32_SYSTEM
+ if ((xmode & X_POLLABLE) && kind != BACKEND_W32)
+ {
+ /* We require the W32 backend, because only that allows us to
+ * write directly using the native W32 API and to disable the
+ * system clamp. Note that func_w32_create has already been
+ * called with the flag to disable the system call clamp. */
+ _set_errno (EINVAL);
+ err = -1;
+ goto out;
+ }
+#endif /*HAVE_W32_SYSTEM*/
+
+ stream_new = mem_alloc (sizeof (*stream_new));
+ if (! stream_new)
+ {
+ err = -1;
+ goto out;
+ }
+
+ stream_internal_new = mem_alloc (sizeof (*stream_internal_new));
+ if (! stream_internal_new)
+ {
+ err = -1;
+ goto out;
+ }
+
+ stream_new->buffer = stream_internal_new->buffer;
+ stream_new->buffer_size = sizeof (stream_internal_new->buffer);
+ stream_new->unread_buffer = stream_internal_new->unread_buffer;
+ stream_new->unread_buffer_size = sizeof (stream_internal_new->unread_buffer);
+ stream_new->intern = stream_internal_new;
+
+#if HAVE_W32_SYSTEM
+ if ((xmode & X_POLLABLE))
+ {
+ void *new_cookie;
+
+ err = _gpgrt_w32_pollable_create (&new_cookie, modeflags,
+ functions, cookie);
+ if (err)
+ goto out;
+
+ modeflags &= ~O_NONBLOCK;
+ old_cookie = cookie;
+ cookie = new_cookie;
+ kind = BACKEND_W32_POLLABLE;
+ functions = _gpgrt_functions_w32_pollable;
+ }
+#endif /*HAVE_W32_SYSTEM*/
+
+ init_stream_obj (stream_new, cookie, syshd, kind, functions, modeflags,
+ xmode);
+ init_stream_lock (stream_new);
+
+ err = do_list_add (stream_new, with_locked_list);
+ if (err)
+ goto out;
+
+ *r_stream = stream_new;
+
+ out:
+
+ if (err)
+ {
+ trace_errno (err, ("leave: err=%d", err));
+ if (stream_new)
+ {
+ deinit_stream_obj (stream_new);
+ destroy_stream_lock (stream_new);
+ mem_free (stream_new->intern);
+ mem_free (stream_new);
+ }
+ }
+#if HAVE_W32_SYSTEM
+ else if (old_cookie)
+ trace (("leave: success stream=%p cookie=%p,%p",
+ *r_stream, old_cookie, cookie));
+#endif
+ else
+ trace (("leave: success stream=%p cookie=%p", *r_stream, cookie));
+
+ return err;
+}
+
+
+/*
+ * Deinitialize a stream object and destroy it.
+ */
+static int
+do_close (estream_t stream, int with_locked_list)
+{
+ int err;
+
+ trace (("stream %p %s", stream, with_locked_list? "(with locked list)":""));
+
+ if (stream)
+ {
+ do_list_remove (stream, with_locked_list);
+ while (stream->intern->onclose)
+ {
+ notify_list_t tmp = stream->intern->onclose->next;
+
+ if (stream->intern->onclose->fnc)
+ stream->intern->onclose->fnc (stream,
+ stream->intern->onclose->fnc_value);
+ mem_free (stream->intern->onclose);
+ stream->intern->onclose = tmp;
+ }
+ err = deinit_stream_obj (stream);
+ destroy_stream_lock (stream);
+ mem_free (stream->intern);
+ mem_free (stream);
+ }
+ else
+ err = 0;
+
+ trace_errno (err, ("stream %p err=%d", stream, err));
+ return err;
+}
+
+
+/*
+ * The onclose worker function which is called with a locked
+ * stream.
+ */
+static int
+do_onclose (estream_t stream, int mode,
+ void (*fnc) (estream_t, void*), void *fnc_value)
+{
+ notify_list_t item;
+
+ if (!mode)
+ {
+ for (item = stream->intern->onclose; item; item = item->next)
+ if (item->fnc && item->fnc == fnc && item->fnc_value == fnc_value)
+ item->fnc = NULL; /* Disable this notification. */
+ }
+ else
+ {
+ item = mem_alloc (sizeof *item);
+ if (!item)
+ return -1;
+ item->fnc = fnc;
+ item->fnc_value = fnc_value;
+ item->next = stream->intern->onclose;
+ stream->intern->onclose = item;
+ }
+ return 0;
+}
+
+
+/*
+ * Try to read BYTES_TO_READ bytes from STREAM into BUFFER in
+ * unbuffered-mode, storing the amount of bytes read at BYTES_READ.
+ */
+static int
+do_read_nbf (estream_t _GPGRT__RESTRICT stream,
+ unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_read, size_t *_GPGRT__RESTRICT bytes_read)
+{
+ gpgrt_cookie_read_function_t func_read = stream->intern->func_read;
+ size_t data_read;
+ gpgrt_ssize_t ret;
+ int err;
+
+ data_read = 0;
+ err = 0;
+
+ while (bytes_to_read - data_read)
+ {
+ ret = (*func_read) (stream->intern->cookie,
+ buffer + data_read, bytes_to_read - data_read);
+ if (ret == -1)
+ {
+ err = -1;
+#if EWOULDBLOCK != EAGAIN
+ if (errno == EWOULDBLOCK)
+ _set_errno (EAGAIN);
+#endif
+ break;
+ }
+ else if (ret)
+ data_read += ret;
+ else
+ break;
+ }
+
+ stream->intern->offset += data_read;
+ *bytes_read = data_read;
+
+ return err;
+}
+
+
+/*
+ * Helper for check_pending.
+ */
+static int
+check_pending_nbf (estream_t _GPGRT__RESTRICT stream)
+{
+ gpgrt_cookie_read_function_t func_read = stream->intern->func_read;
+ char buffer[1];
+
+ if (!(*func_read) (stream->intern->cookie, buffer, 0))
+ return 1; /* Pending bytes. */
+ return 0; /* No pending bytes or error. */
+}
+
+
+/*
+ * Try to read BYTES_TO_READ bytes from STREAM into BUFFER in
+ * fully-buffered-mode, storing the amount of bytes read at
+ * BYTES_READ.
+ */
+static int
+do_read_fbf (estream_t _GPGRT__RESTRICT stream,
+ unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_read, size_t *_GPGRT__RESTRICT bytes_read)
+{
+ size_t data_available;
+ size_t data_to_read;
+ size_t data_read;
+ int err;
+
+ data_read = 0;
+ err = 0;
+
+ while ((bytes_to_read - data_read) && (! err))
+ {
+ if (stream->data_offset == stream->data_len)
+ {
+ /* Nothing more to read in current container, try to
+ fill container with new data. */
+ err = fill_stream (stream);
+ if (! err)
+ if (! stream->data_len)
+ /* Filling did not result in any data read. */
+ break;
+ }
+
+ if (! err)
+ {
+ /* Filling resulted in some new data. */
+
+ data_to_read = bytes_to_read - data_read;
+ data_available = stream->data_len - stream->data_offset;
+ if (data_to_read > data_available)
+ data_to_read = data_available;
+
+ memcpy (buffer + data_read,
+ stream->buffer + stream->data_offset, data_to_read);
+ stream->data_offset += data_to_read;
+ data_read += data_to_read;
+ }
+ }
+
+ *bytes_read = data_read;
+
+ return err;
+}
+
+
+/*
+ * Helper for check_pending.
+ */
+static int
+check_pending_fbf (estream_t _GPGRT__RESTRICT stream)
+{
+ gpgrt_cookie_read_function_t func_read = stream->intern->func_read;
+ char buffer[1];
+
+ if (stream->data_offset == stream->data_len)
+ {
+ /* Nothing more to read in current container, check whether it
+ would be possible to fill the container with new data. */
+ if (!(*func_read) (stream->intern->cookie, buffer, 0))
+ return 1; /* Pending bytes. */
+ }
+ else
+ return 1;
+ return 0;
+}
+
+
+/*
+ * Try to read BYTES_TO_READ bytes from STREAM into BUFFER in
+ * line-buffered-mode, storing the amount of bytes read at BYTES_READ.
+ */
+static int
+do_read_lbf (estream_t _GPGRT__RESTRICT stream,
+ unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_read, size_t *_GPGRT__RESTRICT bytes_read)
+{
+ int err;
+
+ err = do_read_fbf (stream, buffer, bytes_to_read, bytes_read);
+
+ return err;
+}
+
+
+/*
+ * Try to read BYTES_TO_READ bytes from STREAM into BUFFER, storing
+ * the amount of bytes read at BYTES_READ.
+ */
+static int
+es_readn (estream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT buffer_arg,
+ size_t bytes_to_read, size_t *_GPGRT__RESTRICT bytes_read)
+{
+ unsigned char *buffer = (unsigned char *)buffer_arg;
+ size_t data_read_unread, data_read;
+ int err;
+
+ data_read_unread = 0;
+ data_read = 0;
+ err = 0;
+
+ if (stream->flags.writing)
+ {
+ /* Switching to reading mode -> flush output. */
+ err = flush_stream (stream);
+ if (err)
+ goto out;
+ stream->flags.writing = 0;
+ }
+
+ /* Read unread data first. */
+ while ((bytes_to_read - data_read_unread) && stream->unread_data_len)
+ {
+ buffer[data_read_unread]
+ = stream->unread_buffer[stream->unread_data_len - 1];
+ stream->unread_data_len--;
+ data_read_unread++;
+ }
+
+ switch (stream->intern->strategy)
+ {
+ case _IONBF:
+ err = do_read_nbf (stream,
+ buffer + data_read_unread,
+ bytes_to_read - data_read_unread, &data_read);
+ break;
+ case _IOLBF:
+ err = do_read_lbf (stream,
+ buffer + data_read_unread,
+ bytes_to_read - data_read_unread, &data_read);
+ break;
+ case _IOFBF:
+ err = do_read_fbf (stream,
+ buffer + data_read_unread,
+ bytes_to_read - data_read_unread, &data_read);
+ break;
+ }
+
+ out:
+
+ if (bytes_read)
+ *bytes_read = data_read_unread + data_read;
+
+ return err;
+}
+
+
+/*
+ * Return true if at least one byte is pending for read. This is a
+ * best effort check and it it possible that bytes are still pending
+ * even if false is returned. If the stream is in writing mode it is
+ * switched to read mode.
+ */
+static int
+check_pending (estream_t _GPGRT__RESTRICT stream)
+{
+ if (stream->flags.writing)
+ {
+ /* Switching to reading mode -> flush output. */
+ if (flush_stream (stream))
+ return 0; /* Better return 0 on error. */
+ stream->flags.writing = 0;
+ }
+
+ /* Check unread data first. */
+ if (stream->unread_data_len)
+ return 1;
+
+ switch (stream->intern->strategy)
+ {
+ case _IONBF:
+ return check_pending_nbf (stream);
+ case _IOLBF:
+ case _IOFBF:
+ return check_pending_fbf (stream);
+ }
+
+ return 0;
+}
+
+
+/*
+ * Try to unread DATA_N bytes from DATA into STREAM, storing the
+ * amount of bytes successfully unread at BYTES_UNREAD.
+ */
+static void
+es_unreadn (estream_t _GPGRT__RESTRICT stream,
+ const unsigned char *_GPGRT__RESTRICT data, size_t data_n,
+ size_t *_GPGRT__RESTRICT bytes_unread)
+{
+ size_t space_left;
+
+ space_left = stream->unread_buffer_size - stream->unread_data_len;
+
+ if (data_n > space_left)
+ data_n = space_left;
+
+ if (! data_n)
+ goto out;
+
+ memcpy (stream->unread_buffer + stream->unread_data_len, data, data_n);
+ stream->unread_data_len += data_n;
+ stream->intern->indicators.eof = 0;
+
+ out:
+
+ if (bytes_unread)
+ *bytes_unread = data_n;
+}
+
+
+/*
+ * Seek in STREAM.
+ */
+static int
+es_seek (estream_t _GPGRT__RESTRICT stream, gpgrt_off_t offset, int whence,
+ gpgrt_off_t *_GPGRT__RESTRICT offset_new)
+{
+ gpgrt_cookie_seek_function_t func_seek = stream->intern->func_seek;
+ int err, ret;
+ gpgrt_off_t off;
+
+ if (! func_seek)
+ {
+ _set_errno (EOPNOTSUPP);
+ err = -1;
+ goto out;
+ }
+
+ if (stream->flags.writing)
+ {
+ /* Flush data first in order to prevent flushing it to the wrong
+ offset. */
+ err = flush_stream (stream);
+ if (err)
+ goto out;
+ stream->flags.writing = 0;
+ }
+
+ off = offset;
+ if (whence == SEEK_CUR)
+ {
+ off = off - stream->data_len + stream->data_offset;
+ off -= stream->unread_data_len;
+ }
+
+ ret = (*func_seek) (stream->intern->cookie, &off, whence);
+ if (ret == -1)
+ {
+ err = -1;
+#if EWOULDBLOCK != EAGAIN
+ if (errno == EWOULDBLOCK)
+ _set_errno (EAGAIN);
+#endif
+ goto out;
+ }
+
+ err = 0;
+ es_empty (stream);
+
+ if (offset_new)
+ *offset_new = off;
+
+ stream->intern->indicators.eof = 0;
+ stream->intern->offset = off;
+
+ out:
+
+ if (err)
+ {
+ if (errno == EPIPE)
+ stream->intern->indicators.hup = 1;
+ stream->intern->indicators.err = 1;
+ }
+
+ return err;
+}
+
+
+/*
+ * Write BYTES_TO_WRITE bytes from BUFFER into STREAM in
+ * unbuffered-mode, storing the amount of bytes written at
+ * BYTES_WRITTEN.
+ */
+static int
+es_write_nbf (estream_t _GPGRT__RESTRICT stream,
+ const unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_write, size_t *_GPGRT__RESTRICT bytes_written)
+{
+ gpgrt_cookie_write_function_t func_write = stream->intern->func_write;
+ size_t data_written;
+ gpgrt_ssize_t ret;
+ int err;
+
+ if (bytes_to_write && (! func_write))
+ {
+ _set_errno (EOPNOTSUPP);
+ err = -1;
+ goto out;
+ }
+
+ data_written = 0;
+ err = 0;
+
+ while (bytes_to_write - data_written)
+ {
+ ret = (*func_write) (stream->intern->cookie,
+ buffer + data_written,
+ bytes_to_write - data_written);
+ if (ret == -1)
+ {
+ err = -1;
+#if EWOULDBLOCK != EAGAIN
+ if (errno == EWOULDBLOCK)
+ _set_errno (EAGAIN);
+#endif
+ break;
+ }
+ else
+ data_written += ret;
+ }
+
+ stream->intern->offset += data_written;
+ *bytes_written = data_written;
+
+ out:
+
+ return err;
+}
+
+
+/*
+ * Write BYTES_TO_WRITE bytes from BUFFER into STREAM in
+ * fully-buffered-mode, storing the amount of bytes written at
+ * BYTES_WRITTEN.
+ */
+static int
+es_write_fbf (estream_t _GPGRT__RESTRICT stream,
+ const unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_write, size_t *_GPGRT__RESTRICT bytes_written)
+{
+ size_t space_available;
+ size_t data_to_write;
+ size_t data_written;
+ int err;
+
+ data_written = 0;
+ err = 0;
+
+ while ((bytes_to_write - data_written) && (! err))
+ {
+ if (stream->data_offset == stream->buffer_size)
+ /* Container full, flush buffer. */
+ err = flush_stream (stream);
+
+ if (! err)
+ {
+ /* Flushing resulted in empty container. */
+
+ data_to_write = bytes_to_write - data_written;
+ space_available = stream->buffer_size - stream->data_offset;
+ if (data_to_write > space_available)
+ data_to_write = space_available;
+
+ memcpy (stream->buffer + stream->data_offset,
+ buffer + data_written, data_to_write);
+ stream->data_offset += data_to_write;
+ data_written += data_to_write;
+ }
+ }
+
+ *bytes_written = data_written;
+
+ return err;
+}
+
+
+/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in
+ line-buffered-mode, storing the amount of bytes written in
+ *BYTES_WRITTEN. */
+static int
+es_write_lbf (estream_t _GPGRT__RESTRICT stream,
+ const unsigned char *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_write, size_t *_GPGRT__RESTRICT bytes_written)
+{
+ size_t data_flushed = 0;
+ size_t data_buffered = 0;
+ unsigned char *nlp;
+ int err = 0;
+
+ nlp = memrchr (buffer, '\n', bytes_to_write);
+ if (nlp)
+ {
+ /* Found a newline, directly write up to (including) this
+ character. */
+ err = flush_stream (stream);
+ if (!err)
+ err = es_write_nbf (stream, buffer, nlp - buffer + 1, &data_flushed);
+ }
+
+ if (!err)
+ {
+ /* Write remaining data fully buffered. */
+ err = es_write_fbf (stream, buffer + data_flushed,
+ bytes_to_write - data_flushed, &data_buffered);
+ }
+
+ *bytes_written = data_flushed + data_buffered;
+ return err;
+}
+
+
+/* Write BYTES_TO_WRITE bytes from BUFFER into STREAM in, storing the
+ amount of bytes written in BYTES_WRITTEN. */
+static int
+es_writen (estream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer,
+ size_t bytes_to_write, size_t *_GPGRT__RESTRICT bytes_written)
+{
+ size_t data_written;
+ int err;
+
+ data_written = 0;
+ err = 0;
+
+ if (!stream->flags.writing)
+ {
+ /* Switching to writing mode -> discard input data and seek to
+ position at which reading has stopped. We can do this only
+ if a seek function has been registered. */
+ if (stream->intern->func_seek)
+ {
+ err = es_seek (stream, 0, SEEK_CUR, NULL);
+ if (err)
+ {
+ if (errno == ESPIPE)
+ err = 0;
+ else
+ goto out;
+ }
+ stream->flags.writing = 1;
+ }
+ }
+
+ switch (stream->intern->strategy)
+ {
+ case _IONBF:
+ err = es_write_nbf (stream, buffer, bytes_to_write, &data_written);
+ break;
+
+ case _IOLBF:
+ err = es_write_lbf (stream, buffer, bytes_to_write, &data_written);
+ break;
+
+ case _IOFBF:
+ err = es_write_fbf (stream, buffer, bytes_to_write, &data_written);
+ break;
+ }
+
+ out:
+
+ if (bytes_written)
+ *bytes_written = data_written;
+
+ return err;
+}
+
+
+static int
+peek_stream (estream_t _GPGRT__RESTRICT stream,
+ unsigned char **_GPGRT__RESTRICT data,
+ size_t *_GPGRT__RESTRICT data_len)
+{
+ int err;
+
+ if (stream->flags.writing)
+ {
+ /* Switching to reading mode -> flush output. */
+ err = flush_stream (stream);
+ if (err)
+ goto out;
+ stream->flags.writing = 0;
+ }
+
+ if (stream->data_offset == stream->data_len)
+ {
+ /* Refill container. */
+ err = fill_stream (stream);
+ if (err)
+ goto out;
+ }
+
+ if (data)
+ *data = stream->buffer + stream->data_offset;
+ if (data_len)
+ *data_len = stream->data_len - stream->data_offset;
+ err = 0;
+
+ out:
+
+ return err;
+}
+
+
+/* Skip SIZE bytes of input data contained in buffer. */
+static int
+skip_stream (estream_t stream, size_t size)
+{
+ int err;
+
+ if (stream->data_offset + size > stream->data_len)
+ {
+ _set_errno (EINVAL);
+ err = -1;
+ }
+ else
+ {
+ stream->data_offset += size;
+ err = 0;
+ }
+
+ return err;
+}
+
+
+static int
+doreadline (estream_t _GPGRT__RESTRICT stream, size_t max_length,
+ char *_GPGRT__RESTRICT *_GPGRT__RESTRICT line,
+ size_t *_GPGRT__RESTRICT line_length)
+{
+ size_t line_size;
+ estream_t line_stream;
+ char *line_new;
+ void *line_stream_cookie;
+ char *newline;
+ unsigned char *data;
+ size_t data_len;
+ int err;
+ es_syshd_t syshd;
+
+ line_new = NULL;
+ line_stream = NULL;
+ line_stream_cookie = NULL;
+
+ err = func_mem_create (&line_stream_cookie, NULL, 0, 0,
+ BUFFER_BLOCK_SIZE, 1,
+ mem_realloc, mem_free,
+ O_RDWR,
+ 0);
+ if (err)
+ goto out;
+
+ memset (&syshd, 0, sizeof syshd);
+ err = create_stream (&line_stream, line_stream_cookie,
+ &syshd, BACKEND_MEM,
+ estream_functions_mem, O_RDWR, 1, 0);
+ if (err)
+ goto out;
+
+ {
+ size_t space_left = max_length;
+
+ line_size = 0;
+ for (;;)
+ {
+ if (max_length && (space_left == 1))
+ break;
+
+ err = peek_stream (stream, &data, &data_len);
+ if (err || (! data_len))
+ break;
+
+ if (data_len > (space_left - 1))
+ data_len = space_left - 1;
+
+ newline = memchr (data, '\n', data_len);
+ if (newline)
+ {
+ data_len = (newline - (char *) data) + 1;
+ err = _gpgrt_write (line_stream, data, data_len, NULL);
+ if (! err)
+ {
+ /* Not needed: space_left -= data_len */
+ line_size += data_len;
+ skip_stream (stream, data_len);
+ break; /* endless loop */
+ }
+ }
+ else
+ {
+ err = _gpgrt_write (line_stream, data, data_len, NULL);
+ if (! err)
+ {
+ space_left -= data_len;
+ line_size += data_len;
+ skip_stream (stream, data_len);
+ }
+ }
+ if (err)
+ break;
+ }
+ }
+ if (err)
+ goto out;
+
+ /* Complete line has been written to line_stream. */
+
+ if ((max_length > 1) && (! line_size))
+ {
+ stream->intern->indicators.eof = 1;
+ goto out;
+ }
+
+ err = es_seek (line_stream, 0, SEEK_SET, NULL);
+ if (err)
+ goto out;
+
+ if (! *line)
+ {
+ line_new = mem_alloc (line_size + 1);
+ if (! line_new)
+ {
+ err = -1;
+ goto out;
+ }
+ }
+ else
+ line_new = *line;
+
+ err = _gpgrt_read (line_stream, line_new, line_size, NULL);
+ if (err)
+ goto out;
+
+ line_new[line_size] = '\0';
+
+ if (! *line)
+ *line = line_new;
+ if (line_length)
+ *line_length = line_size;
+
+ out:
+
+ if (line_stream)
+ do_close (line_stream, 0);
+ else if (line_stream_cookie)
+ func_mem_destroy (line_stream_cookie);
+
+ if (err)
+ {
+ if (! *line)
+ mem_free (line_new);
+ stream->intern->indicators.err = 1;
+ }
+
+ return err;
+}
+
+
+/* Output function used by estream_format. */
+static int
+print_writer (void *outfncarg, const char *buf, size_t buflen)
+{
+ estream_t stream = outfncarg;
+ size_t nwritten;
+ int rc;
+
+ nwritten = 0;
+ rc = es_writen (stream, buf, buflen, &nwritten);
+ stream->intern->print_ntotal += nwritten;
+ return rc;
+}
+
+
+/* The core of our printf function. This is called in locked state. */
+static int
+do_print_stream (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, va_list ap)
+{
+ int rc;
+
+ stream->intern->print_ntotal = 0;
+ rc = _gpgrt_estream_format (print_writer, stream, format, ap);
+ if (rc)
+ return -1;
+ return (int)stream->intern->print_ntotal;
+}
+
+
+static int
+es_set_buffering (estream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buffer, int mode, size_t size)
+{
+ int err;
+
+ /* Flush or empty buffer depending on mode. */
+ if (stream->flags.writing)
+ {
+ err = flush_stream (stream);
+ if (err)
+ goto out;
+ }
+ else
+ es_empty (stream);
+
+ stream->intern->indicators.eof = 0;
+
+ /* Free old buffer in case that was allocated by this function. */
+ if (stream->intern->deallocate_buffer)
+ {
+ stream->intern->deallocate_buffer = 0;
+ mem_free (stream->buffer);
+ stream->buffer = NULL;
+ }
+
+ if (mode == _IONBF)
+ stream->buffer_size = 0;
+ else
+ {
+ void *buffer_new;
+
+ if (buffer)
+ buffer_new = buffer;
+ else
+ {
+ if (!size)
+ size = BUFSIZ;
+ buffer_new = mem_alloc (size);
+ if (! buffer_new)
+ {
+ err = -1;
+ goto out;
+ }
+ }
+
+ stream->buffer = buffer_new;
+ stream->buffer_size = size;
+ if (! buffer)
+ stream->intern->deallocate_buffer = 1;
+ }
+ stream->intern->strategy = mode;
+ err = 0;
+
+ out:
+
+ return err;
+}
+
+
+static gpgrt_off_t
+es_offset_calculate (estream_t stream)
+{
+ gpgrt_off_t offset;
+
+ offset = stream->intern->offset + stream->data_offset;
+ if (offset < stream->unread_data_len)
+ /* Offset undefined. */
+ offset = 0;
+ else
+ offset -= stream->unread_data_len;
+
+ return offset;
+}
+
+
+static void
+es_opaque_ctrl (estream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT opaque_new,
+ void **_GPGRT__RESTRICT opaque_old)
+{
+ if (opaque_old)
+ *opaque_old = stream->intern->opaque;
+ if (opaque_new)
+ stream->intern->opaque = opaque_new;
+}
+
+
+/* API. */
+
+estream_t
+_gpgrt_fopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode)
+{
+ unsigned int modeflags, cmode, xmode;
+ int create_called;
+ estream_t stream;
+ void *cookie;
+ int err;
+ int fd;
+ es_syshd_t syshd;
+
+ stream = NULL;
+ cookie = NULL;
+ create_called = 0;
+
+ err = parse_mode (mode, &modeflags, &xmode, &cmode);
+ if (err)
+ goto out;
+
+ err = func_file_create (&cookie, &fd, path, modeflags, cmode);
+ if (err)
+ goto out;
+
+ syshd.type = ES_SYSHD_FD;
+ syshd.u.fd = fd;
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd, BACKEND_FD,
+ estream_functions_fd, modeflags, xmode, 0);
+ if (err)
+ goto out;
+
+ if (stream && path)
+ fname_set_internal (stream, path, 1);
+
+ out:
+
+ if (err && create_called)
+ (*estream_functions_fd.public.func_close) (cookie);
+
+ return stream;
+}
+
+
+
+/* Create a new estream object in memory. If DATA is not NULL this
+ buffer will be used as the memory buffer; thus after this functions
+ returns with the success the the memory at DATA belongs to the new
+ estream. The allocated length of DATA is given by DATA_LEN and its
+ used length by DATA_N. Usually this is malloced buffer; if a
+ static buffer is provided, the caller must pass false for GROW and
+ provide a dummy function for FUNC_FREE. FUNC_FREE and FUNC_REALLOC
+ allow the caller to provide custom functions for realloc and free
+ to be used by the new estream object. Note that the realloc
+ function is also used for initial allocation. If DATA is NULL a
+ buffer is internally allocated; either using internal function or
+ those provide by the caller. It is an error to provide a realloc
+ function but no free function. Providing only a free function is
+ allowed as long as GROW is false. */
+estream_t
+_gpgrt_mopen (void *_GPGRT__RESTRICT data, size_t data_n, size_t data_len,
+ unsigned int grow,
+ func_realloc_t func_realloc, func_free_t func_free,
+ const char *_GPGRT__RESTRICT mode)
+{
+ int create_called = 0;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ unsigned int modeflags, xmode;
+ int err;
+ es_syshd_t syshd;
+
+ err = parse_mode (mode, &modeflags, &xmode, NULL);
+ if (err)
+ goto out;
+
+ err = func_mem_create (&cookie, data, data_n, data_len,
+ BUFFER_BLOCK_SIZE, grow,
+ func_realloc, func_free, modeflags, 0);
+ if (err)
+ goto out;
+
+ memset (&syshd, 0, sizeof syshd);
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd, BACKEND_MEM,
+ estream_functions_mem, modeflags, xmode, 0);
+
+ out:
+
+ if (err && create_called)
+ (*estream_functions_mem.public.func_close) (cookie);
+
+ return stream;
+}
+
+
+
+estream_t
+_gpgrt_fopenmem (size_t memlimit, const char *_GPGRT__RESTRICT mode)
+{
+ unsigned int modeflags, xmode;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ es_syshd_t syshd;
+
+ /* Memory streams are always read/write. We use MODE only to get
+ the append flag. */
+ if (parse_mode (mode, &modeflags, &xmode, NULL))
+ return NULL;
+ modeflags |= O_RDWR;
+
+ if (func_mem_create (&cookie, NULL, 0, 0,
+ BUFFER_BLOCK_SIZE, 1,
+ mem_realloc, mem_free, modeflags,
+ memlimit))
+ return NULL;
+
+ memset (&syshd, 0, sizeof syshd);
+ if (create_stream (&stream, cookie, &syshd, BACKEND_MEM,
+ estream_functions_mem, modeflags, xmode, 0))
+ (*estream_functions_mem.public.func_close) (cookie);
+
+ return stream;
+}
+
+
+/* This is the same as es_fopenmem but intializes the memory with a
+ copy of (DATA,DATALEN). The stream is initially set to the
+ beginning. If MEMLIMIT is not 0 but shorter than DATALEN it
+ DATALEN will be used as the value for MEMLIMIT. */
+estream_t
+_gpgrt_fopenmem_init (size_t memlimit, const char *_GPGRT__RESTRICT mode,
+ const void *data, size_t datalen)
+{
+ estream_t stream;
+
+ if (memlimit && memlimit < datalen)
+ memlimit = datalen;
+
+ stream = _gpgrt_fopenmem (memlimit, mode);
+ if (stream && data && datalen)
+ {
+ if (es_writen (stream, data, datalen, NULL))
+ {
+ int saveerrno = errno;
+ _gpgrt_fclose (stream);
+ stream = NULL;
+ _set_errno (saveerrno);
+ }
+ else
+ {
+ es_seek (stream, 0L, SEEK_SET, NULL);
+ stream->intern->indicators.eof = 0;
+ stream->intern->indicators.err = 0;
+ }
+ }
+ return stream;
+}
+
+
+
+estream_t
+_gpgrt_fopencookie (void *_GPGRT__RESTRICT cookie,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_cookie_io_functions_t functions)
+{
+ unsigned int modeflags, xmode;
+ estream_t stream;
+ int err;
+ es_syshd_t syshd;
+ struct cookie_io_functions_s io_functions = { functions, NULL, };
+
+ stream = NULL;
+ modeflags = 0;
+
+ err = parse_mode (mode, &modeflags, &xmode, NULL);
+ if (err)
+ goto out;
+
+ memset (&syshd, 0, sizeof syshd);
+ err = create_stream (&stream, cookie, &syshd, BACKEND_USER, io_functions,
+ modeflags, xmode, 0);
+ if (err)
+ goto out;
+
+ out:
+ return stream;
+}
+
+
+
+static estream_t
+do_fdopen (int filedes, const char *mode, int no_close, int with_locked_list)
+{
+ int create_called = 0;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ unsigned int modeflags, xmode;
+ int err;
+ es_syshd_t syshd;
+
+ err = parse_mode (mode, &modeflags, &xmode, NULL);
+ if (err)
+ goto out;
+ if ((xmode & X_SYSOPEN))
+ {
+ /* Not allowed for fdopen. */
+ _set_errno (EINVAL);
+ err = -1;
+ goto out;
+ }
+
+ err = func_fd_create (&cookie, filedes, modeflags, no_close);
+ if (err)
+ goto out;
+
+ syshd.type = ES_SYSHD_FD;
+ syshd.u.fd = filedes;
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd,
+ BACKEND_FD, estream_functions_fd,
+ modeflags, xmode, with_locked_list);
+
+ if (!err && stream)
+ {
+ if ((modeflags & O_NONBLOCK))
+ err = stream->intern->func_ioctl (cookie, COOKIE_IOCTL_NONBLOCK,
+ "", NULL);
+ }
+
+ out:
+ if (err && create_called)
+ (*estream_functions_fd.public.func_close) (cookie);
+
+ return stream;
+}
+
+estream_t
+_gpgrt_fdopen (int filedes, const char *mode)
+{
+ return do_fdopen (filedes, mode, 0, 0);
+}
+
+/* A variant of es_fdopen which does not close FILEDES at the end. */
+estream_t
+_gpgrt_fdopen_nc (int filedes, const char *mode)
+{
+ return do_fdopen (filedes, mode, 1, 0);
+}
+
+
+
+static estream_t
+do_fpopen (FILE *fp, const char *mode, int no_close, int with_locked_list)
+{
+ unsigned int modeflags, cmode, xmode;
+ int create_called = 0;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ int err;
+ es_syshd_t syshd;
+
+ err = parse_mode (mode, &modeflags, &xmode, &cmode);
+ if (err)
+ goto out;
+ if ((xmode & X_SYSOPEN))
+ {
+ /* Not allowed for fpopen. */
+ _set_errno (EINVAL);
+ err = -1;
+ goto out;
+ }
+
+ if (fp)
+ fflush (fp);
+ err = func_fp_create (&cookie, fp, modeflags, no_close);
+ if (err)
+ goto out;
+
+ syshd.type = ES_SYSHD_FD;
+ syshd.u.fd = fp? fileno (fp): -1;
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd,
+ BACKEND_FP, estream_functions_fp,
+ modeflags, xmode, with_locked_list);
+
+ out:
+ if (err && create_called)
+ (*estream_functions_fp.public.func_close) (cookie);
+
+ return stream;
+}
+
+
+/* Create an estream from the stdio stream FP. This mechanism is
+ useful in case the stdio streams have special properties and may
+ not be mixed with fd based functions. This is for example the case
+ under Windows where the 3 standard streams are associated with the
+ console whereas a duped and fd-opened stream of one of this stream
+ won't be associated with the console. As this messes things up it
+ is easier to keep on using the standard I/O stream as a backend for
+ estream. */
+estream_t
+_gpgrt_fpopen (FILE *fp, const char *mode)
+{
+ return do_fpopen (fp, mode, 0, 0);
+}
+
+
+/* Same as es_fpopen but does not close FP at the end. */
+estream_t
+_gpgrt_fpopen_nc (FILE *fp, const char *mode)
+{
+ return do_fpopen (fp, mode, 1, 0);
+}
+
+
+
+#ifdef HAVE_W32_SYSTEM
+estream_t
+do_w32open (HANDLE hd, const char *mode,
+ int no_close, int with_locked_list)
+{
+ unsigned int modeflags, cmode, xmode;
+ int create_called = 0;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ int err;
+ es_syshd_t syshd;
+
+ /* For obvious reasons we ignore sysmode here. */
+ err = parse_mode (mode, &modeflags, &xmode, &cmode);
+ if (err)
+ goto leave;
+
+ /* If we are pollable we create the function cookie with syscall
+ * clamp disabled. This is because functions are called from
+ * separatre reader and writer threads in w32-stream. */
+ err = func_w32_create (&cookie, hd, modeflags,
+ no_close, !!(xmode & X_POLLABLE));
+ if (err)
+ goto leave;
+
+ syshd.type = ES_SYSHD_HANDLE;
+ syshd.u.handle = hd;
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd,
+ BACKEND_W32, estream_functions_w32,
+ modeflags, xmode, with_locked_list);
+
+ leave:
+ if (err && create_called)
+ (*estream_functions_w32.public.func_close) (cookie);
+
+ return stream;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+static estream_t
+do_sysopen (es_syshd_t *syshd, const char *mode, int no_close)
+{
+ estream_t stream;
+
+ switch (syshd->type)
+ {
+ case ES_SYSHD_FD:
+ case ES_SYSHD_SOCK:
+ stream = do_fdopen (syshd->u.fd, mode, no_close, 0);
+ break;
+
+#ifdef HAVE_W32_SYSTEM
+ case ES_SYSHD_HANDLE:
+ stream = do_w32open (syshd->u.handle, mode, no_close, 0);
+ break;
+#endif
+
+ /* FIXME: Support RVIDs under Wince? */
+
+ default:
+ _set_errno (EINVAL);
+ stream = NULL;
+ }
+ return stream;
+}
+
+/* On POSIX systems this function is an alias for es_fdopen. Under
+ Windows it uses the bare W32 API and thus a HANDLE instead of a
+ file descriptor. */
+estream_t
+_gpgrt_sysopen (es_syshd_t *syshd, const char *mode)
+{
+ return do_sysopen (syshd, mode, 0);
+}
+
+/* Same as es_sysopen but the handle/fd will not be closed by
+ es_fclose. */
+estream_t
+_gpgrt_sysopen_nc (es_syshd_t *syshd, const char *mode)
+{
+ return do_sysopen (syshd, mode, 1);
+}
+
+
+
+/* Set custom standard descriptors to be used for stdin, stdout and
+ stderr. This function needs to be called before any of the
+ standard streams are accessed. This internal version uses a double
+ dash inside its name. */
+void
+_gpgrt__set_std_fd (int no, int fd)
+{
+ /* fprintf (stderr, "es_set_std_fd(%d, %d)\n", no, fd); */
+ lock_list ();
+ if (no >= 0 && no < 3 && !custom_std_fds_valid[no])
+ {
+ custom_std_fds[no] = fd;
+ custom_std_fds_valid[no] = 1;
+ }
+ unlock_list ();
+}
+
+
+/* Return the stream used for stdin, stdout or stderr.
+ This internal version uses a double dash inside its name. */
+estream_t
+_gpgrt__get_std_stream (int fd)
+{
+ estream_list_t list_obj;
+ estream_t stream = NULL;
+
+ fd %= 3; /* We only allow 0, 1 or 2 but we don't want to return an error. */
+
+ lock_list ();
+
+ for (list_obj = estream_list; list_obj; list_obj = list_obj->next)
+ if (list_obj->stream && list_obj->stream->intern->is_stdstream
+ && list_obj->stream->intern->stdstream_fd == fd)
+ {
+ stream = list_obj->stream;
+ break;
+ }
+ if (!stream)
+ {
+ /* Standard stream not yet created. We first try to create them
+ from registered file descriptors. */
+ if (!fd && custom_std_fds_valid[0])
+ stream = do_fdopen (custom_std_fds[0], "r", 1, 1);
+ else if (fd == 1 && custom_std_fds_valid[1])
+ stream = do_fdopen (custom_std_fds[1], "a", 1, 1);
+ else if (custom_std_fds_valid[2])
+ stream = do_fdopen (custom_std_fds[2], "a", 1, 1);
+
+ if (!stream)
+ {
+ /* Second try is to use the standard C streams. */
+ if (!fd)
+ stream = do_fpopen (stdin, "r", 1, 1);
+ else if (fd == 1)
+ stream = do_fpopen (stdout, "a", 1, 1);
+ else
+ stream = do_fpopen (stderr, "a", 1, 1);
+ }
+
+ if (!stream)
+ {
+ /* Last try: Create a bit bucket. */
+ stream = do_fpopen (NULL, fd? "a":"r", 0, 1);
+ if (!stream)
+ {
+ fprintf (stderr, "fatal: error creating a dummy estream"
+ " for %d: %s\n", fd, strerror (errno));
+ abort();
+ }
+ }
+
+ stream->intern->is_stdstream = 1;
+ stream->intern->stdstream_fd = fd;
+ if (fd == 2)
+ es_set_buffering (stream, NULL, _IOLBF, 0);
+ fname_set_internal (stream,
+ fd == 0? "[stdin]" :
+ fd == 1? "[stdout]" : "[stderr]", 0);
+ }
+
+ unlock_list ();
+ return stream;
+}
+
+/* Note: A "samethread" keyword given in "mode" is ignored and the
+ * value used by STREAM is used instead. Note that this function is
+ * the reasons why some of the init and deinit code is split up into
+ * several functions. */
+estream_t
+_gpgrt_freopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ int err;
+
+ if (path)
+ {
+ unsigned int modeflags, cmode, xmode, dummy;
+ int create_called;
+ void *cookie;
+ int fd;
+ es_syshd_t syshd;
+
+ cookie = NULL;
+ create_called = 0;
+
+ xmode = stream->intern->samethread ? X_SAMETHREAD : 0;
+
+ lock_stream (stream);
+
+ deinit_stream_obj (stream);
+
+ err = parse_mode (mode, &modeflags, &dummy, &cmode);
+ if (err)
+ goto leave;
+ (void)dummy;
+
+ err = func_file_create (&cookie, &fd, path, modeflags, cmode);
+ if (err)
+ goto leave;
+
+ syshd.type = ES_SYSHD_FD;
+ syshd.u.fd = fd;
+ create_called = 1;
+ init_stream_obj (stream, cookie, &syshd, BACKEND_FD,
+ estream_functions_fd, modeflags, xmode);
+
+ leave:
+
+ if (err)
+ {
+ if (create_called)
+ func_fd_destroy (cookie);
+
+ do_close (stream, 0);
+ stream = NULL;
+ }
+ else
+ {
+ if (path)
+ fname_set_internal (stream, path, 1);
+ unlock_stream (stream);
+ }
+ }
+ else
+ {
+ /* FIXME? We don't support re-opening at the moment. */
+ _set_errno (EINVAL);
+ deinit_stream_obj (stream);
+ do_close (stream, 0);
+ stream = NULL;
+ }
+
+ return stream;
+}
+
+
+int
+_gpgrt_fclose (estream_t stream)
+{
+ int err;
+
+ err = do_close (stream, 0);
+
+ return err;
+}
+
+
+/* This is a special version of es_fclose which can be used with
+ es_fopenmem to return the memory buffer. This is feature is useful
+ to write to a memory buffer using estream. Note that the function
+ does not close the stream if the stream does not support snatching
+ the buffer. On error NULL is stored at R_BUFFER. Note that if no
+ write operation has happened, NULL may also be stored at BUFFER on
+ success. The caller needs to release the returned memory using
+ gpgrt_free. */
+int
+_gpgrt_fclose_snatch (estream_t stream, void **r_buffer, size_t *r_buflen)
+{
+ int err;
+
+ /* Note: There is no need to lock the stream in a close call. The
+ object will be destroyed after the close and thus any other
+ contender for the lock would work on a closed stream. */
+
+ if (r_buffer)
+ {
+ cookie_ioctl_function_t func_ioctl = stream->intern->func_ioctl;
+ size_t buflen;
+
+ *r_buffer = NULL;
+
+ if (!func_ioctl)
+ {
+ _set_errno (EOPNOTSUPP);
+ err = -1;
+ goto leave;
+ }
+
+ if (stream->flags.writing)
+ {
+ err = flush_stream (stream);
+ if (err)
+ goto leave;
+ stream->flags.writing = 0;
+ }
+
+ err = func_ioctl (stream->intern->cookie, COOKIE_IOCTL_SNATCH_BUFFER,
+ r_buffer, &buflen);
+ if (err)
+ goto leave;
+ if (r_buflen)
+ *r_buflen = buflen;
+ }
+
+ err = do_close (stream, 0);
+
+ leave:
+ if (err && r_buffer)
+ {
+ mem_free (*r_buffer);
+ *r_buffer = NULL;
+ }
+ return err;
+}
+
+
+/* Register or unregister a close notification function for STREAM.
+ FNC is the function to call and FNC_VALUE the value passed as
+ second argument. To register the notification the value for MODE
+ must be 1. If mode is 0 the function tries to remove or disable an
+ already registered notification; for this to work the value of FNC
+ and FNC_VALUE must be the same as with the registration and
+ FNC_VALUE must be a unique value. No error will be returned if
+ MODE is 0.
+
+ FIXME: I think the next comment is not anymore correct:
+ Unregister should only be used in the error case because it may not
+ be able to remove memory internally allocated for the onclose
+ handler.
+
+ FIXME: Unregister is not thread safe.
+
+ The notification will be called right before the stream is closed.
+ It may not call any estream function for STREAM, neither direct nor
+ indirectly. */
+int
+_gpgrt_onclose (estream_t stream, int mode,
+ void (*fnc) (estream_t, void*), void *fnc_value)
+{
+ int err;
+
+ lock_stream (stream);
+ err = do_onclose (stream, mode, fnc, fnc_value);
+ unlock_stream (stream);
+
+ return err;
+}
+
+
+int
+_gpgrt_fileno_unlocked (estream_t stream)
+{
+ es_syshd_t syshd;
+
+ if (_gpgrt_syshd_unlocked (stream, &syshd))
+ return -1;
+ switch (syshd.type)
+ {
+ case ES_SYSHD_FD: return syshd.u.fd;
+ case ES_SYSHD_SOCK: return syshd.u.sock;
+ default:
+ _set_errno (EINVAL);
+ return -1;
+ }
+}
+
+
+/* Return the handle of a stream which has been opened by es_sysopen.
+ The caller needs to pass a structure which will be filled with the
+ sys handle. Return 0 on success or true on error and sets errno.
+ This is the unlocked version. */
+int
+_gpgrt_syshd_unlocked (estream_t stream, es_syshd_t *syshd)
+{
+ if (!stream || !syshd || stream->intern->syshd.type == ES_SYSHD_NONE)
+ {
+ if (syshd)
+ syshd->type = ES_SYSHD_NONE;
+ _set_errno (EINVAL);
+ return -1;
+ }
+
+ *syshd = stream->intern->syshd;
+ return 0;
+}
+
+
+void
+_gpgrt_flockfile (estream_t stream)
+{
+ lock_stream (stream);
+}
+
+
+int
+_gpgrt_ftrylockfile (estream_t stream)
+{
+ return trylock_stream (stream);
+}
+
+
+void
+_gpgrt_funlockfile (estream_t stream)
+{
+ unlock_stream (stream);
+}
+
+
+int
+_gpgrt_fileno (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_fileno_unlocked (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+/* Return the handle of a stream which has been opened by es_sysopen.
+ The caller needs to pass a structure which will be filled with the
+ sys handle. Return 0 on success or true on error and sets errno.
+ This is the unlocked version. */
+int
+_gpgrt_syshd (estream_t stream, es_syshd_t *syshd)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_syshd_unlocked (stream, syshd);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt__pending_unlocked (estream_t stream)
+{
+ return check_pending (stream);
+}
+
+
+/* Return true if there is at least one byte pending for read on
+ STREAM. This does only work if the backend supports checking for
+ pending bytes and is thus mostly useful with cookie based backends.
+
+ Note that if this function is used with cookie based functions, the
+ read cookie may be called with 0 for the SIZE argument. If bytes
+ are pending the function is expected to return -1 in this case and
+ thus deviates from the standard behavior of read(2). */
+int
+_gpgrt__pending (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt__pending_unlocked (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt_feof_unlocked (estream_t stream)
+{
+ return stream->intern->indicators.eof;
+}
+
+
+int
+_gpgrt_feof (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_feof_unlocked (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt_ferror_unlocked (estream_t stream)
+{
+ return stream->intern->indicators.err;
+}
+
+
+int
+_gpgrt_ferror (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_ferror_unlocked (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+void
+_gpgrt_clearerr_unlocked (estream_t stream)
+{
+ stream->intern->indicators.eof = 0;
+ stream->intern->indicators.err = 0;
+ /* We do not reset the HUP indicator because there is no way to
+ get out of this state. */
+}
+
+
+void
+_gpgrt_clearerr (estream_t stream)
+{
+ lock_stream (stream);
+ _gpgrt_clearerr_unlocked (stream);
+ unlock_stream (stream);
+}
+
+
+static int
+do_fflush (estream_t stream)
+{
+ int err;
+
+ if (stream->flags.writing)
+ err = flush_stream (stream);
+ else
+ {
+ es_empty (stream);
+ err = 0;
+ }
+
+ return err;
+}
+
+
+int
+_gpgrt_fflush (estream_t stream)
+{
+ int err;
+
+ if (stream)
+ {
+ lock_stream (stream);
+ err = do_fflush (stream);
+ unlock_stream (stream);
+ }
+ else
+ {
+ estream_list_t item;
+
+ err = 0;
+ lock_list ();
+ for (item = estream_list; item; item = item->next)
+ if (item->stream)
+ {
+ lock_stream (item->stream);
+ err |= do_fflush (item->stream);
+ unlock_stream (item->stream);
+ }
+ unlock_list ();
+ }
+ return err ? EOF : 0;
+}
+
+
+int
+_gpgrt_fseek (estream_t stream, long int offset, int whence)
+{
+ int err;
+
+ lock_stream (stream);
+ err = es_seek (stream, offset, whence, NULL);
+ unlock_stream (stream);
+
+ return err;
+}
+
+
+int
+_gpgrt_fseeko (estream_t stream, gpgrt_off_t offset, int whence)
+{
+ int err;
+
+ lock_stream (stream);
+ err = es_seek (stream, offset, whence, NULL);
+ unlock_stream (stream);
+
+ return err;
+}
+
+
+long int
+_gpgrt_ftell (estream_t stream)
+{
+ long int ret;
+
+ lock_stream (stream);
+ ret = es_offset_calculate (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+gpgrt_off_t
+_gpgrt_ftello (estream_t stream)
+{
+ gpgrt_off_t ret = -1;
+
+ lock_stream (stream);
+ ret = es_offset_calculate (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+void
+_gpgrt_rewind (estream_t stream)
+{
+ lock_stream (stream);
+ es_seek (stream, 0L, SEEK_SET, NULL);
+ /* Note that es_seek already cleared the EOF flag. */
+ stream->intern->indicators.err = 0;
+ unlock_stream (stream);
+}
+
+
+int
+_gpgrt__getc_underflow (estream_t stream)
+{
+ int err;
+ unsigned char c;
+ size_t bytes_read;
+
+ err = es_readn (stream, &c, 1, &bytes_read);
+
+ return (err || (! bytes_read)) ? EOF : c;
+}
+
+
+int
+_gpgrt__putc_overflow (int c, estream_t stream)
+{
+ unsigned char d = c;
+ int err;
+
+ err = es_writen (stream, &d, 1, NULL);
+
+ return err ? EOF : c;
+}
+
+
+int
+_gpgrt_fgetc (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_getc_unlocked (stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt_fputc (int c, estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = _gpgrt_putc_unlocked (c, stream);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt_ungetc (int c, estream_t stream)
+{
+ unsigned char data = (unsigned char) c;
+ size_t data_unread;
+
+ lock_stream (stream);
+ es_unreadn (stream, &data, 1, &data_unread);
+ unlock_stream (stream);
+
+ return data_unread ? c : EOF;
+}
+
+
+int
+_gpgrt_read (estream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT buffer, size_t bytes_to_read,
+ size_t *_GPGRT__RESTRICT bytes_read)
+{
+ int err;
+
+ if (bytes_to_read)
+ {
+ lock_stream (stream);
+ err = es_readn (stream, buffer, bytes_to_read, bytes_read);
+ unlock_stream (stream);
+ }
+ else
+ err = 0;
+
+ return err;
+}
+
+
+int
+_gpgrt_write (estream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t bytes_to_write,
+ size_t *_GPGRT__RESTRICT bytes_written)
+{
+ int err;
+
+ if (bytes_to_write)
+ {
+ lock_stream (stream);
+ err = es_writen (stream, buffer, bytes_to_write, bytes_written);
+ unlock_stream (stream);
+ }
+ else
+ err = 0;
+
+ return err;
+}
+
+
+size_t
+_gpgrt_fread (void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ size_t ret, bytes;
+
+ if (size * nitems)
+ {
+ lock_stream (stream);
+ es_readn (stream, ptr, size * nitems, &bytes);
+ unlock_stream (stream);
+
+ ret = bytes / size;
+ }
+ else
+ ret = 0;
+
+ return ret;
+}
+
+
+size_t
+_gpgrt_fwrite (const void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ size_t ret, bytes;
+
+ if (size * nitems)
+ {
+ lock_stream (stream);
+ es_writen (stream, ptr, size * nitems, &bytes);
+ unlock_stream (stream);
+
+ ret = bytes / size;
+ }
+ else
+ ret = 0;
+
+ return ret;
+}
+
+
+char *
+_gpgrt_fgets (char *_GPGRT__RESTRICT buffer, int length,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ unsigned char *s = (unsigned char*)buffer;
+ int c;
+
+ if (!length)
+ return NULL;
+
+ c = EOF;
+ lock_stream (stream);
+ while (length > 1 && (c = _gpgrt_getc_unlocked (stream)) != EOF && c != '\n')
+ {
+ *s++ = c;
+ length--;
+ }
+ unlock_stream (stream);
+
+ if (c == EOF && s == (unsigned char*)buffer)
+ return NULL; /* Nothing read. */
+
+ if (c != EOF && length > 1)
+ *s++ = c;
+
+ *s = 0;
+ return buffer;
+}
+
+
+int
+_gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ size_t length;
+ int err;
+
+ length = strlen (s);
+ err = es_writen (stream, s, length, NULL);
+ return err ? EOF : 0;
+}
+
+int
+_gpgrt_fputs (const char *_GPGRT__RESTRICT s, estream_t _GPGRT__RESTRICT stream)
+{
+ size_t length;
+ int err;
+
+ length = strlen (s);
+ lock_stream (stream);
+ err = es_writen (stream, s, length, NULL);
+ unlock_stream (stream);
+
+ return err ? EOF : 0;
+}
+
+
+gpgrt_ssize_t
+_gpgrt_getline (char *_GPGRT__RESTRICT *_GPGRT__RESTRICT lineptr,
+ size_t *_GPGRT__RESTRICT n, estream_t _GPGRT__RESTRICT stream)
+{
+ char *line = NULL;
+ size_t line_n = 0;
+ int err;
+
+ lock_stream (stream);
+ err = doreadline (stream, 0, &line, &line_n);
+ unlock_stream (stream);
+ if (err)
+ goto out;
+
+ if (*n)
+ {
+ /* Caller wants us to use his buffer. */
+
+ if (*n < (line_n + 1))
+ {
+ /* Provided buffer is too small -> resize. */
+
+ void *p;
+
+ p = mem_realloc (*lineptr, line_n + 1);
+ if (! p)
+ err = -1;
+ else
+ {
+ if (*lineptr != p)
+ *lineptr = p;
+ }
+ }
+
+ if (! err)
+ {
+ memcpy (*lineptr, line, line_n + 1);
+ if (*n != line_n)
+ *n = line_n;
+ }
+ mem_free (line);
+ }
+ else
+ {
+ /* Caller wants new buffers. */
+ *lineptr = line;
+ *n = line_n;
+ }
+
+ out:
+
+ return err ? err : (gpgrt_ssize_t)line_n;
+}
+
+
+
+/* Same as fgets() but if the provided buffer is too short a larger
+ one will be allocated. This is similar to getline. A line is
+ considered a byte stream ending in a LF.
+
+ If MAX_LENGTH is not NULL, it shall point to a value with the
+ maximum allowed allocation.
+
+ Returns the length of the line. EOF is indicated by a line of
+ length zero. A truncated line is indicated my setting the value at
+ MAX_LENGTH to 0. If the returned value is less then 0 not enough
+ memory was available or another error occurred; ERRNO is then set
+ accordingly.
+
+ If a line has been truncated, the file pointer is moved forward to
+ the end of the line so that the next read starts with the next
+ line. Note that MAX_LENGTH must be re-initialzied in this case.
+
+ The caller initially needs to provide the address of a variable,
+ initialized to NULL, at ADDR_OF_BUFFER and don't change this value
+ anymore with the following invocations. LENGTH_OF_BUFFER should be
+ the address of a variable, initialized to 0, which is also
+ maintained by this function. Thus, both paramaters should be
+ considered the state of this function.
+
+ Note: The returned buffer is allocated with enough extra space to
+ allow the caller to append a CR,LF,Nul. The buffer should be
+ released using gpgrt_free.
+ */
+gpgrt_ssize_t
+_gpgrt_read_line (estream_t stream,
+ char **addr_of_buffer, size_t *length_of_buffer,
+ size_t *max_length)
+{
+ int c;
+ char *buffer = *addr_of_buffer;
+ size_t length = *length_of_buffer;
+ size_t nbytes = 0;
+ size_t maxlen = max_length? *max_length : 0;
+ char *p;
+
+ if (!buffer)
+ {
+ /* No buffer given - allocate a new one. */
+ length = 256;
+ buffer = mem_alloc (length);
+ *addr_of_buffer = buffer;
+ if (!buffer)
+ {
+ *length_of_buffer = 0;
+ if (max_length)
+ *max_length = 0;
+ return -1;
+ }
+ *length_of_buffer = length;
+ }
+
+ if (length < 4)
+ {
+ /* This should never happen. If it does, the function has been
+ called with wrong arguments. */
+ _set_errno (EINVAL);
+ return -1;
+ }
+ length -= 3; /* Reserve 3 bytes for CR,LF,EOL. */
+
+ lock_stream (stream);
+ p = buffer;
+ while ((c = _gpgrt_getc_unlocked (stream)) != EOF)
+ {
+ if (nbytes == length)
+ {
+ /* Enlarge the buffer. */
+ if (maxlen && length > maxlen)
+ {
+ /* We are beyond our limit: Skip the rest of the line. */
+ while (c != '\n' && (c=_gpgrt_getc_unlocked (stream)) != EOF)
+ ;
+ *p++ = '\n'; /* Always append a LF (we reserved some space). */
+ nbytes++;
+ if (max_length)
+ *max_length = 0; /* Indicate truncation. */
+ break; /* the while loop. */
+ }
+ length += 3; /* Adjust for the reserved bytes. */
+ length += length < 1024? 256 : 1024;
+ *addr_of_buffer = mem_realloc (buffer, length);
+ if (!*addr_of_buffer)
+ {
+ int save_errno = errno;
+ mem_free (buffer);
+ *length_of_buffer = 0;
+ if (max_length)
+ *max_length = 0;
+ unlock_stream (stream);
+ _set_errno (save_errno);
+ return -1;
+ }
+ buffer = *addr_of_buffer;
+ *length_of_buffer = length;
+ length -= 3;
+ p = buffer + nbytes;
+ }
+ *p++ = c;
+ nbytes++;
+ if (c == '\n')
+ break;
+ }
+ *p = 0; /* Make sure the line is a string. */
+ unlock_stream (stream);
+
+ return nbytes;
+}
+
+/* Wrapper around free() to match the memory allocation system used by
+ estream. Should be used for all buffers returned to the caller by
+ libestream. If a custom allocation handler has been set with
+ gpgrt_set_alloc_func that register function may be used
+ instead. This function has been moved to init.c. */
+/* void */
+/* _gpgrt_free (void *a) */
+/* { */
+/* mem_free (a); */
+/* } */
+
+
+int
+_gpgrt_vfprintf_unlocked (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format,
+ va_list ap)
+{
+ return do_print_stream (stream, format, ap);
+}
+
+
+int
+_gpgrt_vfprintf (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format,
+ va_list ap)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = do_print_stream (stream, format, ap);
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+int
+_gpgrt_fprintf_unlocked (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+{
+ int ret;
+
+ va_list ap;
+ va_start (ap, format);
+ ret = do_print_stream (stream, format, ap);
+ va_end (ap);
+
+ return ret;
+}
+
+
+int
+_gpgrt_fprintf (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+{
+ int ret;
+
+ va_list ap;
+ va_start (ap, format);
+ lock_stream (stream);
+ ret = do_print_stream (stream, format, ap);
+ unlock_stream (stream);
+ va_end (ap);
+
+ return ret;
+}
+
+
+static int
+tmpfd (void)
+{
+#ifdef HAVE_W32_SYSTEM
+ int attempts, n;
+#ifdef HAVE_W32CE_SYSTEM
+ wchar_t buffer[MAX_PATH+9+12+1];
+# define mystrlen(a) wcslen (a)
+ wchar_t *name, *p;
+#else
+ char buffer[MAX_PATH+9+12+1];
+# define mystrlen(a) strlen (a)
+ char *name, *p;
+#endif
+ HANDLE file;
+ int pid = GetCurrentProcessId ();
+ unsigned int value;
+ int i;
+
+ n = GetTempPath (MAX_PATH+1, buffer);
+ if (!n || n > MAX_PATH || mystrlen (buffer) > MAX_PATH)
+ {
+ _set_errno (ENOENT);
+ return -1;
+ }
+ p = buffer + mystrlen (buffer);
+#ifdef HAVE_W32CE_SYSTEM
+ wcscpy (p, L"_estream");
+#else
+ strcpy (p, "_estream");
+#endif
+ p += 8;
+ /* We try to create the directory but don't care about an error as
+ it may already exist and the CreateFile would throw an error
+ anyway. */
+ CreateDirectory (buffer, NULL);
+ *p++ = '\\';
+ name = p;
+ for (attempts=0; attempts < 10; attempts++)
+ {
+ p = name;
+ value = (GetTickCount () ^ ((pid<<16) & 0xffff0000));
+ for (i=0; i < 8; i++)
+ {
+ *p++ = tohex (((value >> 28) & 0x0f));
+ value <<= 4;
+ }
+#ifdef HAVE_W32CE_SYSTEM
+ wcscpy (p, L".tmp");
+#else
+ strcpy (p, ".tmp");
+#endif
+ file = CreateFile (buffer,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ NULL,
+ CREATE_NEW,
+ FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
+ NULL);
+ if (file != INVALID_HANDLE_VALUE)
+ {
+#ifdef HAVE_W32CE_SYSTEM
+ int fd = (int)file;
+#else
+ int fd = _open_osfhandle ((long)file, 0);
+ if (fd == -1)
+ {
+ CloseHandle (file);
+ return -1;
+ }
+#endif
+ return fd;
+ }
+ Sleep (1); /* One ms as this is the granularity of GetTickCount. */
+ }
+ _set_errno (ENOENT);
+ return -1;
+#else /*!HAVE_W32_SYSTEM*/
+ FILE *fp;
+ int fp_fd;
+ int fd;
+
+ fp = NULL;
+ fd = -1;
+
+ fp = tmpfile ();
+ if (! fp)
+ goto out;
+
+ fp_fd = fileno (fp);
+ fd = dup (fp_fd);
+
+ out:
+
+ if (fp)
+ fclose (fp);
+
+ return fd;
+#endif /*!HAVE_W32_SYSTEM*/
+}
+
+estream_t
+_gpgrt_tmpfile (void)
+{
+ unsigned int modeflags;
+ int create_called = 0;
+ estream_t stream = NULL;
+ void *cookie = NULL;
+ int err;
+ int fd;
+ es_syshd_t syshd;
+
+ modeflags = O_RDWR | O_TRUNC | O_CREAT;
+
+ fd = tmpfd ();
+ if (fd == -1)
+ {
+ err = -1;
+ goto out;
+ }
+
+ err = func_fd_create (&cookie, fd, modeflags, 0);
+ if (err)
+ goto out;
+
+ syshd.type = ES_SYSHD_FD;
+ syshd.u.fd = fd;
+ create_called = 1;
+ err = create_stream (&stream, cookie, &syshd,
+ BACKEND_FD, estream_functions_fd,
+ modeflags, 0, 0);
+
+ out:
+ if (err)
+ {
+ if (create_called)
+ func_fd_destroy (cookie);
+ else if (fd != -1)
+ close (fd);
+ stream = NULL;
+ }
+
+ return stream;
+}
+
+
+int
+_gpgrt_setvbuf (estream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buf, int type, size_t size)
+{
+ int err;
+
+ if ((type == _IOFBF || type == _IOLBF || type == _IONBF)
+ && (!buf || size || type == _IONBF))
+ {
+ lock_stream (stream);
+ err = es_set_buffering (stream, buf, type, size);
+ unlock_stream (stream);
+ }
+ else
+ {
+ _set_errno (EINVAL);
+ err = -1;
+ }
+
+ return err;
+}
+
+
+/* Put a stream into binary mode. This is only needed for the
+ standard streams if they are to be used in a binary way. On Unix
+ systems it is never needed but MSDOS based systems require such a
+ call. It needs to be called before any I/O is done on STREAM. */
+void
+_gpgrt_set_binary (estream_t stream)
+{
+ lock_stream (stream);
+ if (!(stream->intern->modeflags & O_BINARY))
+ {
+ stream->intern->modeflags |= O_BINARY;
+#ifdef HAVE_DOSISH_SYSTEM
+ if (stream->intern->func_read == func_fd_read)
+ {
+ estream_cookie_fd_t fd_cookie = stream->intern->cookie;
+
+ if (!IS_INVALID_FD (fd_cookie->fd))
+ setmode (fd_cookie->fd, O_BINARY);
+ }
+ else if (stream->intern->func_read == func_fp_read)
+ {
+ estream_cookie_fp_t fp_cookie = stream->intern->cookie;
+
+ if (fp_cookie->fp)
+ setmode (fileno (fp_cookie->fp), O_BINARY);
+ }
+#endif
+ }
+ unlock_stream (stream);
+}
+
+
+/* Set non-blocking mode for STREAM. Use true for ONOFF to enable and
+ false to disable non-blocking mode. Returns 0 on success or -1 on
+ error and sets ERRNO. Note that not all backends support
+ non-blocking mode.
+
+ In non-blocking mode a system call will not block but return an
+ error and set errno to EAGAIN. The estream API always uses EAGAIN
+ and not EWOULDBLOCK. If a buffered function like es_fgetc() or
+ es_fgets() returns an error and both, feof() and ferror() return
+ false the caller may assume that the error condition was EAGAIN.
+
+ Switching back from non-blocking to blocking may raise problems
+ with buffering, thus care should be taken. Although read+write
+ sockets are supported in theory, switching from write to read may
+ result into problems because estream may first flush the write
+ buffers and there is no way to handle that non-blocking (EAGAIN)
+ case. Explicit flushing should thus be done before before
+ switching to read. */
+int
+_gpgrt_set_nonblock (estream_t stream, int onoff)
+{
+ cookie_ioctl_function_t func_ioctl;
+ int ret;
+
+ lock_stream (stream);
+ func_ioctl = stream->intern->func_ioctl;
+ if (!func_ioctl)
+ {
+ _set_errno (EOPNOTSUPP);
+ ret = -1;
+ }
+ else
+ {
+ unsigned int save_flags = stream->intern->modeflags;
+
+ if (onoff)
+ stream->intern->modeflags |= O_NONBLOCK;
+ else
+ stream->intern->modeflags &= ~O_NONBLOCK;
+
+ ret = func_ioctl (stream->intern->cookie, COOKIE_IOCTL_NONBLOCK,
+ onoff?"":NULL, NULL);
+ if (ret)
+ stream->intern->modeflags = save_flags;
+ }
+ unlock_stream (stream);
+ return ret;
+}
+
+
+/* Return true if STREAM is in non-blocking mode. */
+int
+_gpgrt_get_nonblock (estream_t stream)
+{
+ int ret;
+
+ lock_stream (stream);
+ ret = !!(stream->intern->modeflags & O_NONBLOCK);
+ unlock_stream (stream);
+ return ret;
+}
+
+
+/* A version of poll(2) working on estream handles. Note that not all
+ estream types work with this function. In contrast to the standard
+ poll function the gpgrt_poll_t object uses a set of bit flags
+ instead of the EVENTS and REVENTS members. An item with the IGNORE
+ flag set is entirely ignored. The TIMEOUT values is given in
+ milliseconds, a value of -1 waits indefinitely, and a value of 0
+ returns immediately.
+
+ A positive return value gives the number of fds with new
+ information. A return value of 0 indicates a timeout and -1
+ indicates an error in which case ERRNO is set. */
+int
+_gpgrt_poll (gpgrt_poll_t *fds, unsigned int nfds, int timeout)
+{
+ gpgrt_poll_t *item;
+ int count = 0;
+ int idx;
+#ifndef HAVE_W32_SYSTEM
+ fd_set readfds, writefds, exceptfds;
+ int any_readfd, any_writefd, any_exceptfd;
+ int max_fd;
+ int fd, ret, any;
+#endif /*HAVE_W32_SYSTEM*/
+
+ trace (("enter: nfds=%u timeout=%d", nfds, timeout));
+
+ if (!fds)
+ {
+ _set_errno (EINVAL);
+ count = -1;
+ goto leave;
+ }
+
+ /* Clear all response fields (even for ignored items). */
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ item->got_read = 0;
+ item->got_write = 0;
+ item->got_oob = 0;
+ item->got_rdhup = 0;
+ item->got_err = 0;
+ item->got_hup = 0;
+ item->got_nval = 0;
+ }
+
+ /* Check for pending reads. */
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ if (item->ignore)
+ continue;
+ if (!item->want_read)
+ continue;
+ if (_gpgrt__pending (item->stream))
+ {
+ item->got_read = 1;
+ count++;
+ }
+ }
+
+ /* Check for space in the write buffers. */
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ if (item->ignore)
+ continue;
+ if (!item->want_write)
+ continue;
+ /* FIXME */
+ }
+
+ if (count)
+ goto leave; /* Early return without waiting. */
+
+ /* Now do the real select. */
+#ifdef HAVE_W32_SYSTEM
+
+ count = _gpgrt_w32_poll (fds, nfds, timeout);
+
+#else /*!HAVE_W32_SYSTEM*/
+
+ any_readfd = any_writefd = any_exceptfd = 0;
+ max_fd = 0;
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ if (item->ignore)
+ continue;
+ fd = _gpgrt_fileno (item->stream);
+ if (fd == -1)
+ continue; /* Stream does not support polling. */
+
+ if (item->want_read)
+ {
+ if (!any_readfd)
+ {
+ FD_ZERO (&readfds);
+ any_readfd = 1;
+ }
+ FD_SET (fd, &readfds);
+ if (fd > max_fd)
+ max_fd = fd;
+ }
+ if (item->want_write)
+ {
+ if (!any_writefd)
+ {
+ FD_ZERO (&writefds);
+ any_writefd = 1;
+ }
+ FD_SET (fd, &writefds);
+ if (fd > max_fd)
+ max_fd = fd;
+ }
+ if (item->want_oob)
+ {
+ if (!any_exceptfd)
+ {
+ FD_ZERO (&exceptfds);
+ any_exceptfd = 1;
+ }
+ FD_SET (fd, &exceptfds);
+ if (fd > max_fd)
+ max_fd = fd;
+ }
+ }
+
+ if (pre_syscall_func)
+ pre_syscall_func ();
+ do
+ {
+ struct timeval timeout_val;
+
+ timeout_val.tv_sec = timeout / 1000;
+ timeout_val.tv_usec = (timeout % 1000) * 1000;
+ ret = select (max_fd+1,
+ any_readfd? &readfds : NULL,
+ any_writefd? &writefds : NULL,
+ any_exceptfd? &exceptfds : NULL,
+ timeout == -1 ? NULL : &timeout_val);
+ }
+ while (ret == -1 && errno == EINTR);
+ if (post_syscall_func)
+ post_syscall_func ();
+
+ if (ret == -1)
+ {
+ trace_errno (1, ("select failed: "));
+ count = -1;
+ goto leave;
+ }
+ if (!ret)
+ {
+ /* Timeout. Note that in this case we can't return got_err for
+ * an invalid stream. */
+ count = 0;
+ goto leave;
+ }
+
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ if (item->ignore)
+ continue;
+ fd = _gpgrt_fileno (item->stream);
+ if (fd == -1)
+ {
+ item->got_err = 1; /* Stream does not support polling. */
+ count++;
+ continue;
+ }
+
+ any = 0;
+ if (item->stream->intern->indicators.hup)
+ {
+ item->got_hup = 1;
+ any = 1;
+ }
+ if (item->want_read && FD_ISSET (fd, &readfds))
+ {
+ item->got_read = 1;
+ any = 1;
+ }
+ if (item->want_write && FD_ISSET (fd, &writefds))
+ {
+ item->got_write = 1;
+ any = 1;
+ }
+ if (item->want_oob && FD_ISSET (fd, &exceptfds))
+ {
+ item->got_oob = 1;
+ any = 1;
+ }
+
+ if (any)
+ count++;
+ }
+#endif /*!HAVE_W32_SYSTEM*/
+
+ leave:
+#ifdef ENABLE_TRACING
+ trace (("leave: count=%d", count));
+ if (count > 0)
+ {
+ for (item = fds, idx = 0; idx < nfds; item++, idx++)
+ {
+ trace ((" %3d %c%c%c%c%c %c%c%c%c%c%c%c",
+ idx,
+ fds[idx].want_read? 'r':'-',
+ fds[idx].want_write? 'w':'-',
+ fds[idx].want_oob? 'o':'-',
+ fds[idx].want_rdhup? 'h':'-',
+ fds[idx].ignore? 'i':'-',
+ fds[idx].got_read? 'r':'-',
+ fds[idx].got_write? 'w':'-',
+ fds[idx].got_oob? 'o':'-',
+ fds[idx].got_rdhup? 'h':'-',
+ fds[idx].got_hup? 'H':'-',
+ fds[idx].got_err? 'e':'-',
+ fds[idx].got_nval? 'n':'-'
+ ));
+ }
+ }
+#endif /*ENABLE_TRACING*/
+ return count;
+}
+
+
+void
+_gpgrt_opaque_set (estream_t stream, void *opaque)
+{
+ lock_stream (stream);
+ es_opaque_ctrl (stream, opaque, NULL);
+ unlock_stream (stream);
+}
+
+
+void *
+_gpgrt_opaque_get (estream_t stream)
+{
+ void *opaque;
+
+ lock_stream (stream);
+ es_opaque_ctrl (stream, NULL, &opaque);
+ unlock_stream (stream);
+
+ return opaque;
+}
+
+
+static void
+fname_set_internal (estream_t stream, const char *fname, int quote)
+{
+ if (stream->intern->printable_fname
+ && !stream->intern->printable_fname_inuse)
+ {
+ mem_free (stream->intern->printable_fname);
+ stream->intern->printable_fname = NULL;
+ }
+ if (stream->intern->printable_fname)
+ return; /* Can't change because it is in use. */
+
+ if (*fname != '[')
+ quote = 0;
+ else
+ quote = !!quote;
+
+ stream->intern->printable_fname = mem_alloc (strlen (fname) + quote + 1);
+ if (quote)
+ stream->intern->printable_fname[0] = '\\';
+ strcpy (stream->intern->printable_fname+quote, fname);
+}
+
+
+/* Set the filename attribute of STREAM. There is no error return.
+ as long as STREAM is valid. This function is called internally by
+ functions which open a filename. */
+void
+_gpgrt_fname_set (estream_t stream, const char *fname)
+{
+ if (fname)
+ {
+ lock_stream (stream);
+ fname_set_internal (stream, fname, 1);
+ unlock_stream (stream);
+ }
+}
+
+
+/* Return the filename attribute of STREAM. In case no filename has
+ been set, "[?]" will be returned. The returned file name is valid
+ as long as STREAM is valid. */
+const char *
+_gpgrt_fname_get (estream_t stream)
+{
+ const char *fname;
+
+ lock_stream (stream);
+ fname = stream->intern->printable_fname;
+ if (fname)
+ stream->intern->printable_fname_inuse = 1;
+ unlock_stream (stream);
+ if (!fname)
+ fname = "[?]";
+ return fname;
+}
+
+
+
+/* Print a BUFFER to STREAM while replacing all control characters and
+ the characters in DELIMITERS by standard C escape sequences.
+ Returns 0 on success or -1 on error. If BYTES_WRITTEN is not NULL
+ the number of bytes actually written are stored at this
+ address. */
+int
+_gpgrt_write_sanitized (estream_t _GPGRT__RESTRICT stream,
+ const void * _GPGRT__RESTRICT buffer, size_t length,
+ const char * delimiters,
+ size_t * _GPGRT__RESTRICT bytes_written)
+{
+ const unsigned char *p = buffer;
+ size_t count = 0;
+ int ret;
+
+ lock_stream (stream);
+ for (; length; length--, p++, count++)
+ {
+ if (*p < 0x20
+ || *p == 0x7f
+ || (delimiters
+ && (strchr (delimiters, *p) || *p == '\\')))
+ {
+ _gpgrt_putc_unlocked ('\\', stream);
+ count++;
+ if (*p == '\n')
+ {
+ _gpgrt_putc_unlocked ('n', stream);
+ count++;
+ }
+ else if (*p == '\r')
+ {
+ _gpgrt_putc_unlocked ('r', stream);
+ count++;
+ }
+ else if (*p == '\f')
+ {
+ _gpgrt_putc_unlocked ('f', stream);
+ count++;
+ }
+ else if (*p == '\v')
+ {
+ _gpgrt_putc_unlocked ('v', stream);
+ count++;
+ }
+ else if (*p == '\b')
+ {
+ _gpgrt_putc_unlocked ('b', stream);
+ count++;
+ }
+ else if (!*p)
+ {
+ _gpgrt_putc_unlocked('0', stream);
+ count++;
+ }
+ else
+ {
+ _gpgrt_fprintf_unlocked (stream, "x%02x", *p);
+ count += 3;
+ }
+ }
+ else
+ {
+ _gpgrt_putc_unlocked (*p, stream);
+ count++;
+ }
+ }
+
+ if (bytes_written)
+ *bytes_written = count;
+ ret = _gpgrt_ferror_unlocked (stream)? -1 : 0;
+ unlock_stream (stream);
+
+ return ret;
+}
+
+
+/* Write LENGTH bytes of BUFFER to STREAM as a hex encoded string.
+ RESERVED must be 0. Returns 0 on success or -1 on error. If
+ BYTES_WRITTEN is not NULL the number of bytes actually written are
+ stored at this address. */
+int
+_gpgrt_write_hexstring (estream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ int reserved, size_t *_GPGRT__RESTRICT bytes_written )
+{
+ int ret;
+ const unsigned char *s;
+ size_t count = 0;
+
+ (void)reserved;
+
+#define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
+
+ if (!length)
+ return 0;
+
+ lock_stream (stream);
+
+ for (s = buffer; length; s++, length--)
+ {
+ _gpgrt_putc_unlocked ( tohex ((*s>>4)&15), stream);
+ _gpgrt_putc_unlocked ( tohex (*s&15), stream);
+ count += 2;
+ }
+
+ if (bytes_written)
+ *bytes_written = count;
+ ret = _gpgrt_ferror_unlocked (stream)? -1 : 0;
+
+ unlock_stream (stream);
+
+ return ret;
+
+#undef tohex
+}
diff --git a/src/gen-posix-lock-obj.c b/src/gen-posix-lock-obj.c
index de2c8bc..e6f33ae 100644
--- a/src/gen-posix-lock-obj.c
+++ b/src/gen-posix-lock-obj.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -26,37 +26,68 @@
#endif
#include <stdlib.h>
+#include <string.h>
#include <stdio.h>
#include <errno.h>
-#include <pthread.h>
+#ifdef USE_POSIX_THREADS
+# include <pthread.h>
+#endif
#include "posix-lock-obj.h"
#define PGM "gen-posix-lock-obj"
/* Check that configure did its job. */
+#ifdef USE_POSIX_THREADS
#if SIZEOF_PTHREAD_MUTEX_T < 4
# error sizeof pthread_mutex_t is not known.
#endif
+#endif
-static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
+/* Special requirements for certain platforms. */
+# define USE_LONG_DOUBLE_FOR_ALIGNMENT 0
+#if defined(__sun) && !defined (__LP64__) && !defined(_LP64)
+/* Solaris on 32-bit architecture. */
+# define USE_DOUBLE_FOR_ALIGNMENT 1
+#else
+# define USE_DOUBLE_FOR_ALIGNMENT 0
+#endif
+#if defined(__hppa__)
+# define USE_16BYTE_ALIGNMENT 1
+#else
+# define USE_16BYTE_ALIGNMENT 0
+#endif
+#if USE_16BYTE_ALIGNMENT && !HAVE_GCC_ATTRIBUTE_ALIGNED
+# error compiler is not able to enforce a 16 byte alignment
+#endif
+
+#ifdef USE_POSIX_THREADS
+static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
+#endif
int
main (void)
{
+#ifdef USE_POSIX_THREADS
unsigned char *p;
int i;
+#endif
struct {
- pthread_mutex_t mtx;
long vers;
+#ifdef USE_POSIX_THREADS
+ pthread_mutex_t mtx;
+#endif
} dummyobj;
+
+#ifdef USE_POSIX_THREADS
if (sizeof mtx != SIZEOF_PTHREAD_MUTEX_T)
{
fprintf (stderr, PGM ": pthread_mutex_t mismatch\n");
exit (1);
}
+#endif /*USE_POSIX_THREADS*/
if (sizeof (dummyobj) != sizeof (_gpgrt_lock_t))
{
@@ -64,25 +95,44 @@ main (void)
exit (1);
}
- /* To force a probably suitable alignment of the structure we use a
- union and include a long and a pointer to a long. */
- printf ("## lock-obj-pub.%s.h\n"
+ printf ("## lock-obj-pub.%s.h%s\n"
"## File created by " PGM " - DO NOT EDIT\n"
"## To be included by mkheader into gpg-error.h\n"
- "\n"
- "typedef struct\n"
+ "\n",
+ HOST_TRIPLET_STRING,
+#ifdef USE_POSIX_THREADS
+ ""
+#else
+ " - NO LOCK SUPPORT"
+#endif
+ );
+
+#ifdef USE_POSIX_THREADS
+
+ /* To force a probably suitable alignment of the structure we use a
+ union and include a long and a pointer to a long. */
+ printf ("typedef struct\n"
"{\n"
" long _vers;\n"
" union {\n"
" volatile char _priv[%d];\n"
+ "%s"
" long _x_align;\n"
" long *_xp_align;\n"
" } u;\n"
"} gpgrt_lock_t;\n"
"\n"
"#define GPGRT_LOCK_INITIALIZER {%d,{{",
- HOST_TRIPLET_STRING,
SIZEOF_PTHREAD_MUTEX_T,
+# if USE_16BYTE_ALIGNMENT
+ " int _x16_align __attribute__ ((aligned (16)));\n",
+# elif USE_DOUBLE_FOR_ALIGNMENT
+ " double _xd_align;\n",
+# elif USE_LONG_DOUBLE_FOR_ALIGNMENT
+ " long double _xld_align;\n",
+# else
+ "",
+# endif
LOCK_ABI_VERSION);
p = (unsigned char *)&mtx;
for (i=0; i < sizeof mtx; i++)
@@ -93,8 +143,22 @@ main (void)
if (i < sizeof mtx - 1)
putchar (',');
}
- fputs ("}}}\n"
- "##\n"
+ fputs ("}}}\n", stdout);
+
+#else /*!USE_POSIX_THREADS*/
+
+ printf ("/* Dummy object - no locking available. */\n"
+ "typedef struct\n"
+ "{\n"
+ " long _vers;\n"
+ "} gpgrt_lock_t;\n"
+ "\n"
+ "#define GPGRT_LOCK_INITIALIZER {%d}\n",
+ LOCK_ABI_VERSION);
+
+#endif /*!USE_POSIX_THREADS*/
+
+ fputs ("##\n"
"## Loc" "al Variables:\n"
"## mode: c\n"
"## buffer-read-only: t\n"
diff --git a/src/gen-w32-lock-obj.c b/src/gen-w32-lock-obj.c
index 9e49d1e..f8da67f 100644
--- a/src/gen-w32-lock-obj.c
+++ b/src/gen-w32-lock-obj.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
diff --git a/src/gpg-error.c b/src/gpg-error.c
index fa868ae..f890883 100644
--- a/src/gpg-error.c
+++ b/src/gpg-error.c
@@ -1,5 +1,5 @@
/* gpg-error.c - Determining gpg-error error codes.
- Copyright (C) 2004 g10 Code GmbH
+ Copyright (C) 2004, 2016 g10 Code GmbH
This file is part of libgpg-error.
@@ -7,12 +7,12 @@
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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpg-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -30,7 +30,7 @@
#include <stdio.h>
#ifdef HAVE_LOCALE_H
-# include <locale.h>
+# include <locale.h>
#endif
#ifdef ENABLE_NLS
#ifdef HAVE_W32_SYSTEM
@@ -66,7 +66,7 @@ i18n_init (void)
{
#ifdef ENABLE_NLS
char *locale_dir;
-
+
#ifdef HAVE_LC_MESSAGES
setlocale (LC_TIME, "");
setlocale (LC_MESSAGES, "");
@@ -75,7 +75,7 @@ i18n_init (void)
setlocale (LC_ALL, "" );
# endif
#endif
-
+
/* Note that for this program we would only need the textdomain call
because libgpg-error already initializes itself to its locale dir
(via gpg_err_init or a constructor). However this is only done
@@ -115,7 +115,7 @@ get_locale_dir (void)
nbytes = WideCharToMultiByte (CP_UTF8, 0, moddir, -1, NULL, 0, NULL, NULL);
if (nbytes < 0)
return NULL;
-
+
result = malloc (nbytes + strlen (SLDIR) + 1);
if (result)
{
@@ -149,8 +149,8 @@ get_locale_dir (void)
strcpy (result, "c:\\gnupg");
strcat (result, SLDIR);
}
- }
-#undef SLDIR
+ }
+#undef SLDIR
return result;
}
@@ -314,7 +314,7 @@ get_err_from_str_one (char *str, gpg_error_t *err,
{
if (*have_code)
return 0;
-
+
*have_code = 1;
*err |= code;
return 1;
@@ -333,7 +333,7 @@ get_err_from_str (char *str, gpg_error_t *err)
int have_code = 0;
int ret;
char *saved_pos = NULL;
- char saved_char;
+ char saved_char = 0; /* (avoid warning) */
*err = 0;
ret = get_err_from_str_one (str, err, &have_source, &have_code);
@@ -370,41 +370,173 @@ get_err_from_str (char *str, gpg_error_t *err)
}
+static void
+print_desc (const char *symbol)
+{
+ static int initialized;
+ static FILE *fp;
+ char line[512];
+ char *p;
+ int indesc = 0;
+ int blanklines = 0;
+ int last_was_keyword = 0;
+
+ if (!symbol)
+ return;
+
+ if (!initialized)
+ {
+ initialized = 1;
+ fp = fopen (PKGDATADIR "/errorref.txt", "r");
+ }
+ if (!fp)
+ return;
+ rewind (fp);
+ while (fgets (line, sizeof line, fp))
+ {
+ if (*line == '#')
+ continue;
+ if (*line && line[strlen(line)-1] == '\n')
+ line[strlen(line)-1] = 0;
+
+ if (!strncmp (line, "GPG_ERR_", 8))
+ {
+ if (indesc == 1 && last_was_keyword)
+ continue; /* Skip keywords immediately following a matched
+ * keyword. */
+ last_was_keyword = 1;
+
+ indesc = 0;
+ p = strchr (line, ' ');
+ if (!p)
+ continue;
+ *p = 0;
+ if (!strcmp (line, symbol))
+ {
+ indesc = 1;
+ continue; /* Skip this line. */
+ }
+ }
+ else
+ last_was_keyword = 0;
+ if (!indesc)
+ continue;
+ if (indesc == 1 && !*line)
+ continue; /* Skip leading empty lines in a description. */
+ if (indesc == 1)
+ putchar ('\n'); /* One leading empty line. */
+ indesc = 2;
+ if (!*line)
+ {
+ blanklines++;
+ continue;
+ }
+ for (; blanklines; blanklines--)
+ putchar ('\n');
+ printf ("%s\n", line);
+ }
+ putchar ('\n'); /* One trailing blank line. */
+}
+
+
+
+
+static int
+show_usage (const char *name)
+{
+ if (name)
+ {
+ fprintf (stderr, _("Usage: %s GPG-ERROR [...]\n"),
+ strrchr (name,'/')? (strrchr (name, '/')+1): name);
+ exit (1);
+ }
+
+ fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
+ fputs ("Options:\n"
+ " --version Print version\n"
+ " --lib-version Print library version\n"
+ " --help Print this help\n"
+ " --list Print all error codes\n"
+ " --defines Print all error codes as #define lines\n"
+ " --desc Print with error description\n"
+ , stdout);
+ exit (0);
+}
+
+
+
int
main (int argc, char *argv[])
{
- int i = 1;
+ const char *pgmname = argv[0];
+ int last_argc = -1;
+ int i;
int listmode = 0;
+ int desc = 0;
const char *source_sym;
const char *error_sym;
gpg_error_t err;
-#ifndef GPG_ERR_INITIALIZED
- gpg_err_init ();
-#endif
-
+ gpgrt_init ();
i18n_init ();
- if (argc == 1)
- {
- fprintf (stderr, _("Usage: %s GPG-ERROR [...]\n"),
- strrchr (argv[0],'/')? (strrchr (argv[0], '/')+1): argv[0]);
- exit (1);
- }
- else if (argc == 2 && !strcmp (argv[1], "--version"))
+ if (argc)
{
- fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
- exit (0);
+ argc--; argv++;
}
- else if (argc == 2 && !strcmp (argv[1], "--list"))
+ while (argc && last_argc != argc )
{
- listmode = 1;
+ last_argc = argc;
+ if (!strcmp (*argv, "--"))
+ {
+ argc--; argv++;
+ break;
+ }
+ else if (!strcmp (*argv, "--version"))
+ {
+ fputs ("gpg-error (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stdout);
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--help"))
+ {
+ show_usage (NULL);
+ }
+ else if (!strcmp (*argv, "--lib-version"))
+ {
+ argc--; argv++;
+ printf ("Version from header: %s (0x%06x)\n",
+ GPG_ERROR_VERSION, GPG_ERROR_VERSION_NUMBER);
+ printf ("Version from binary: %s\n", gpg_error_check_version (NULL));
+ printf ("Copyright blurb ...:%s\n",
+ gpg_error_check_version ("\x01\x01"));
+ exit (0);
+ }
+ else if (!strcmp (*argv, "--list"))
+ {
+ listmode = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--defines"))
+ {
+ listmode = 2;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--desc"))
+ {
+ desc = 1;
+ argc--; argv++;
+ }
+ else if (!strncmp (*argv, "--", 2))
+ show_usage (pgmname);
}
+ if ((argc && listmode) || (!argc && !listmode))
+ show_usage (pgmname);
- if (listmode)
+
+ if (listmode == 1)
{
for (i=0; i < GPG_ERR_SOURCE_DIM; i++)
{
@@ -414,40 +546,93 @@ main (int argc, char *argv[])
err -= 1;
source_sym = gpg_strsource_sym (err);
if (source_sym)
- printf ("%u = (%u, -) = (%s, -) = (%s, -)\n",
- err, gpg_err_source (err),
- source_sym, gpg_strsource (err));
+ {
+ printf ("%u = (%u, -) = (%s, -) = (%s, -)\n",
+ err, gpg_err_source (err),
+ source_sym, gpg_strsource (err));
+ if (desc)
+ print_desc (source_sym);
+ }
}
for (i=0; i < GPG_ERR_CODE_DIM; i++)
{
err = gpg_err_make (GPG_ERR_SOURCE_UNKNOWN, i);
error_sym = gpg_strerror_sym (err);
if (error_sym)
- printf ("%u = (-, %u) = (-, %s) = (-, %s)\n",
- err, gpg_err_code (err),
- error_sym, gpg_strerror (err));
+ {
+ printf ("%u = (-, %u) = (-, %s) = (-, %s)\n",
+ err, gpg_err_code (err),
+ error_sym, gpg_strerror (err));
+ if (desc)
+ print_desc (error_sym);
+ }
}
-
- i = argc; /* Don't run the usual stuff. */
}
- while (i < argc)
+ else if (listmode == 2)
{
- if (get_err_from_number (argv[i], &err)
- || get_err_from_symbol (argv[i], &err)
- || get_err_from_str (argv[i], &err))
- {
+ int n, nmax;
+
+ for (i=0, nmax=0; i < GPG_ERR_SOURCE_DIM; i++)
+ {
+ err = gpg_err_make (i, 1);
+ source_sym = gpg_strsource_sym (err);
+ if (source_sym)
+ {
+ n = strlen (source_sym);
+ if (n > nmax)
+ nmax = n;
+ }
+ }
+ for (i=0; i < GPG_ERR_SOURCE_DIM; i++)
+ {
+ err = gpg_err_make (i, 1);
source_sym = gpg_strsource_sym (err);
+ if (source_sym)
+ printf ("#define %-*s %3u\n", nmax,source_sym,gpg_err_source (err));
+ }
+
+
+ for (i=0, nmax = 0; i < GPG_ERR_CODE_DIM; i++)
+ {
+ err = gpg_err_make (GPG_ERR_SOURCE_UNKNOWN, i);
error_sym = gpg_strerror_sym (err);
-
- printf ("%u = (%u, %u) = (%s, %s) = (%s, %s)\n",
- err, gpg_err_source (err), gpg_err_code (err),
- source_sym ? source_sym : "-", error_sym ? error_sym : "-",
- gpg_strsource (err), gpg_strerror (err));
- }
- else
- fprintf (stderr, _("%s: warning: could not recognize %s\n"),
- argv[0], argv[i]);
- i++;
+ if (error_sym)
+ {
+ n = strlen (error_sym);
+ if (n > nmax)
+ nmax = n;
+ }
+ }
+ for (i=0; i < GPG_ERR_CODE_DIM; i++)
+ {
+ err = gpg_err_make (GPG_ERR_SOURCE_UNKNOWN, i);
+ error_sym = gpg_strerror_sym (err);
+ if (error_sym)
+ printf ("#define %-*s %5u\n", nmax, error_sym, gpg_err_code (err));
+ }
+ }
+ else /* Standard mode. */
+ {
+ for (i=0; i < argc; i++)
+ {
+ if (get_err_from_number (argv[i], &err)
+ || get_err_from_symbol (argv[i], &err)
+ || get_err_from_str (argv[i], &err))
+ {
+ source_sym = gpg_strsource_sym (err);
+ error_sym = gpg_strerror_sym (err);
+
+ printf ("%u = (%u, %u) = (%s, %s) = (%s, %s)\n",
+ err, gpg_err_source (err), gpg_err_code (err),
+ source_sym ? source_sym : "-", error_sym ? error_sym:"-",
+ gpg_strsource (err), gpg_strerror (err));
+ if (desc)
+ print_desc (error_sym);
+ }
+ else
+ fprintf (stderr, _("%s: warning: could not recognize %s\n"),
+ argv[0], argv[i]);
+ }
}
exit (0);
diff --git a/src/gpg-error.def.in b/src/gpg-error.def.in
index 2ea482a..ad65f8c 100644
--- a/src/gpg-error.def.in
+++ b/src/gpg-error.def.in
@@ -1,5 +1,25 @@
-/* gpg-error.def.in - Exported symbols
- * Needs to be processed by CPP.
+/* libgpg-error.def - Exported symbols for W32
+ * Copyright (C) 2014 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ *
+ * Note: This file should be updated manually and the ordinals shall
+ * never be changed. Also check gpg-error.vers and visibility.h.
+ *
+ * This file needs to be pre-processed.
*/
#include <config.h>
@@ -10,7 +30,7 @@ EXPORTS
gpg_strsource @3
gpg_err_code_from_errno @4
gpg_err_code_to_errno @5
- gpg_err_init @6
+ /* @6 - Not anymore used. */
gpg_err_code_from_syserror @7
gpg_err_set_errno @8
#ifdef HAVE_W32CE_SYSTEM
@@ -26,7 +46,7 @@ EXPORTS
_gpg_w32_gettext_localename @16
_gpg_w32_gettext_use_utf8 @17
#endif
- gpg_err_deinit @18
+ /* @18 - Not anymore used. */
gpg_error_check_version @19
gpgrt_lock_init @20
@@ -34,3 +54,106 @@ EXPORTS
gpgrt_lock_unlock @22
gpgrt_lock_destroy @23
gpgrt_yield @24
+ gpgrt_lock_trylock @25
+
+ gpgrt_set_syscall_clamp @26
+
+ gpgrt_fopen @27
+ gpgrt_mopen @28
+ gpgrt_fopenmem @29
+ gpgrt_fopenmem_init @30
+ gpgrt_fdopen @31
+ gpgrt_fdopen_nc @32
+ gpgrt_sysopen @33
+ gpgrt_sysopen_nc @34
+ gpgrt_fpopen @35
+ gpgrt_fpopen_nc @36
+ gpgrt_freopen @37
+ gpgrt_fopencookie @38
+ gpgrt_fclose @39
+ gpgrt_fclose_snatch @40
+ gpgrt_onclose @41
+ gpgrt_fileno @42
+ gpgrt_fileno_unlocked @43
+ gpgrt_syshd @44
+ gpgrt_syshd_unlocked @45
+ _gpgrt_set_std_fd @46
+ _gpgrt_get_std_stream @47
+ gpgrt_flockfile @48
+ gpgrt_ftrylockfile @49
+ gpgrt_funlockfile @50
+ gpgrt_feof @51
+ gpgrt_feof_unlocked @52
+ gpgrt_ferror @53
+ gpgrt_ferror_unlocked @54
+ gpgrt_clearerr @55
+ gpgrt_clearerr_unlocked @56
+ gpgrt_fflush @57
+ gpgrt_fseek @58
+ gpgrt_fseeko @59
+ gpgrt_ftell @60
+ gpgrt_ftello @61
+ gpgrt_rewind @62
+ gpgrt_fgetc @63
+ _gpgrt_getc_underflow @64
+ gpgrt_fputc @65
+ _gpgrt_putc_overflow @66
+ gpgrt_ungetc @67
+ gpgrt_read @68
+ gpgrt_write @69
+ gpgrt_write_sanitized @70
+ gpgrt_write_hexstring @71
+ gpgrt_fread @72
+ gpgrt_fwrite @73
+ gpgrt_fgets @74
+ gpgrt_fputs @75
+ gpgrt_fputs_unlocked @76
+ gpgrt_getline @77
+ gpgrt_read_line @78
+ gpgrt_free @79
+ gpgrt_fprintf @80
+ gpgrt_fprintf_unlocked @81
+ gpgrt_printf @82
+ gpgrt_printf_unlocked @83
+ gpgrt_vfprintf @84
+ gpgrt_vfprintf_unlocked @85
+ gpgrt_setvbuf @86
+ gpgrt_setbuf @87
+ gpgrt_set_binary @88
+ gpgrt_tmpfile @89
+ gpgrt_opaque_set @90
+ gpgrt_opaque_get @91
+ gpgrt_fname_set @92
+ gpgrt_fname_get @93
+ gpgrt_asprintf @94
+ gpgrt_vasprintf @95
+ gpgrt_bsprintf @96
+ gpgrt_vbsprintf @97
+ gpgrt_snprintf @98
+ gpgrt_vsnprintf @99
+
+ gpgrt_check_version @100
+ gpg_err_init @101
+ gpg_err_deinit @102
+ gpgrt_set_alloc_func @103
+
+ _gpgrt_pending @104
+ _gpgrt_pending_unlocked @105
+
+ gpgrt_set_nonblock @106
+ gpgrt_get_nonblock @107
+ gpgrt_poll @108
+
+#ifdef HAVE_W32_SYSTEM
+ gpgrt_w32_iconv_open @109
+ gpgrt_w32_iconv_close @110
+ gpgrt_w32_iconv @111
+#endif
+
+ gpgrt_get_syscall_clamp @112
+
+ gpgrt_b64dec_start @113
+ gpgrt_b64dec_proc @114
+ gpgrt_b64dec_finish @115
+
+;; end of file with public symbols for Windows.
diff --git a/src/gpg-error.h b/src/gpg-error.h
deleted file mode 100644
index be3ccff..0000000
--- a/src/gpg-error.h
+++ /dev/null
@@ -1,754 +0,0 @@
-/* gpg-error.h - Public interface to libgpg-error. -*- c -*-
- Copyright (C) 2003, 2004, 2010, 2013, 2014 g10 Code GmbH
-
- This file is part of libgpg-error.
-
- libgpg-error is free software; you can redistribute it 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.
-
- libgpg-error is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- Do not edit. Generated from gpg-error.h.in for x86_64-unknown-linux-gnu.
- */
-
-
-#ifndef GPG_ERROR_H
-#define GPG_ERROR_H 1
-
-#include <stddef.h>
-
-#ifdef __GNUC__
-#define GPG_ERR_INLINE __inline__
-#elif _MSC_VER >= 1300
-#define GPG_ERR_INLINE __inline
-#elif __STDC_VERSION__ >= 199901L
-#define GPG_ERR_INLINE inline
-#else
-#ifndef GPG_ERR_INLINE
-#define GPG_ERR_INLINE
-#endif
-#endif
-
-
-#ifdef __cplusplus
-extern "C" {
-#if 0 /* just to make Emacs auto-indent happy */
-}
-#endif
-#endif /* __cplusplus */
-
-/* The GnuPG project consists of many components. Error codes are
- exchanged between all components. The common error codes and their
- user-presentable descriptions are kept into a shared library to
- allow adding new error codes and components without recompiling any
- of the other components. The interface will not change in a
- backward incompatible way.
-
- An error code together with an error source build up an error
- value. As the error value is been passed from one component to
- another, it preserver the information about the source and nature
- of the error.
-
- A component of the GnuPG project can define the following macros to
- tune the behaviour of the library:
-
- GPG_ERR_SOURCE_DEFAULT: Define to an error source of type
- gpg_err_source_t to make that source the default for gpg_error().
- Otherwise GPG_ERR_SOURCE_UNKNOWN is used as default.
-
- GPG_ERR_ENABLE_GETTEXT_MACROS: Define to provide macros to map the
- internal gettext API to standard names. This has only an effect on
- Windows platforms.
-
- In addition to the error codes, Libgpg-error also provides a set of
- functions used by most GnuPG components. */
-
-
-/* The error source type gpg_err_source_t.
-
- Where as the Poo out of a welle small
- Taketh his firste springing and his sours.
- --Chaucer. */
-
-/* Only use free slots, never change or reorder the existing
- entries. */
-typedef enum
- {
- GPG_ERR_SOURCE_UNKNOWN = 0,
- GPG_ERR_SOURCE_GCRYPT = 1,
- GPG_ERR_SOURCE_GPG = 2,
- GPG_ERR_SOURCE_GPGSM = 3,
- GPG_ERR_SOURCE_GPGAGENT = 4,
- GPG_ERR_SOURCE_PINENTRY = 5,
- GPG_ERR_SOURCE_SCD = 6,
- GPG_ERR_SOURCE_GPGME = 7,
- GPG_ERR_SOURCE_KEYBOX = 8,
- GPG_ERR_SOURCE_KSBA = 9,
- GPG_ERR_SOURCE_DIRMNGR = 10,
- GPG_ERR_SOURCE_GSTI = 11,
- GPG_ERR_SOURCE_GPA = 12,
- GPG_ERR_SOURCE_KLEO = 13,
- GPG_ERR_SOURCE_G13 = 14,
- GPG_ERR_SOURCE_ASSUAN = 15,
- GPG_ERR_SOURCE_ANY = 31,
- GPG_ERR_SOURCE_USER_1 = 32,
- GPG_ERR_SOURCE_USER_2 = 33,
- GPG_ERR_SOURCE_USER_3 = 34,
- GPG_ERR_SOURCE_USER_4 = 35,
-
- /* This is one more than the largest allowed entry. */
- GPG_ERR_SOURCE_DIM = 128
- } gpg_err_source_t;
-
-
-/* The error code type gpg_err_code_t. */
-
-/* Only use free slots, never change or reorder the existing
- entries. */
-typedef enum
- {
- GPG_ERR_NO_ERROR = 0,
- GPG_ERR_GENERAL = 1,
- GPG_ERR_UNKNOWN_PACKET = 2,
- GPG_ERR_UNKNOWN_VERSION = 3,
- GPG_ERR_PUBKEY_ALGO = 4,
- GPG_ERR_DIGEST_ALGO = 5,
- GPG_ERR_BAD_PUBKEY = 6,
- GPG_ERR_BAD_SECKEY = 7,
- GPG_ERR_BAD_SIGNATURE = 8,
- GPG_ERR_NO_PUBKEY = 9,
- GPG_ERR_CHECKSUM = 10,
- GPG_ERR_BAD_PASSPHRASE = 11,
- GPG_ERR_CIPHER_ALGO = 12,
- GPG_ERR_KEYRING_OPEN = 13,
- GPG_ERR_INV_PACKET = 14,
- GPG_ERR_INV_ARMOR = 15,
- GPG_ERR_NO_USER_ID = 16,
- GPG_ERR_NO_SECKEY = 17,
- GPG_ERR_WRONG_SECKEY = 18,
- GPG_ERR_BAD_KEY = 19,
- GPG_ERR_COMPR_ALGO = 20,
- GPG_ERR_NO_PRIME = 21,
- GPG_ERR_NO_ENCODING_METHOD = 22,
- GPG_ERR_NO_ENCRYPTION_SCHEME = 23,
- GPG_ERR_NO_SIGNATURE_SCHEME = 24,
- GPG_ERR_INV_ATTR = 25,
- GPG_ERR_NO_VALUE = 26,
- GPG_ERR_NOT_FOUND = 27,
- GPG_ERR_VALUE_NOT_FOUND = 28,
- GPG_ERR_SYNTAX = 29,
- GPG_ERR_BAD_MPI = 30,
- GPG_ERR_INV_PASSPHRASE = 31,
- GPG_ERR_SIG_CLASS = 32,
- GPG_ERR_RESOURCE_LIMIT = 33,
- GPG_ERR_INV_KEYRING = 34,
- GPG_ERR_TRUSTDB = 35,
- GPG_ERR_BAD_CERT = 36,
- GPG_ERR_INV_USER_ID = 37,
- GPG_ERR_UNEXPECTED = 38,
- GPG_ERR_TIME_CONFLICT = 39,
- GPG_ERR_KEYSERVER = 40,
- GPG_ERR_WRONG_PUBKEY_ALGO = 41,
- GPG_ERR_TRIBUTE_TO_D_A = 42,
- GPG_ERR_WEAK_KEY = 43,
- GPG_ERR_INV_KEYLEN = 44,
- GPG_ERR_INV_ARG = 45,
- GPG_ERR_BAD_URI = 46,
- GPG_ERR_INV_URI = 47,
- GPG_ERR_NETWORK = 48,
- GPG_ERR_UNKNOWN_HOST = 49,
- GPG_ERR_SELFTEST_FAILED = 50,
- GPG_ERR_NOT_ENCRYPTED = 51,
- GPG_ERR_NOT_PROCESSED = 52,
- GPG_ERR_UNUSABLE_PUBKEY = 53,
- GPG_ERR_UNUSABLE_SECKEY = 54,
- GPG_ERR_INV_VALUE = 55,
- GPG_ERR_BAD_CERT_CHAIN = 56,
- GPG_ERR_MISSING_CERT = 57,
- GPG_ERR_NO_DATA = 58,
- GPG_ERR_BUG = 59,
- GPG_ERR_NOT_SUPPORTED = 60,
- GPG_ERR_INV_OP = 61,
- GPG_ERR_TIMEOUT = 62,
- GPG_ERR_INTERNAL = 63,
- GPG_ERR_EOF_GCRYPT = 64,
- GPG_ERR_INV_OBJ = 65,
- GPG_ERR_TOO_SHORT = 66,
- GPG_ERR_TOO_LARGE = 67,
- GPG_ERR_NO_OBJ = 68,
- GPG_ERR_NOT_IMPLEMENTED = 69,
- GPG_ERR_CONFLICT = 70,
- GPG_ERR_INV_CIPHER_MODE = 71,
- GPG_ERR_INV_FLAG = 72,
- GPG_ERR_INV_HANDLE = 73,
- GPG_ERR_TRUNCATED = 74,
- GPG_ERR_INCOMPLETE_LINE = 75,
- GPG_ERR_INV_RESPONSE = 76,
- GPG_ERR_NO_AGENT = 77,
- GPG_ERR_AGENT = 78,
- GPG_ERR_INV_DATA = 79,
- GPG_ERR_ASSUAN_SERVER_FAULT = 80,
- GPG_ERR_ASSUAN = 81,
- GPG_ERR_INV_SESSION_KEY = 82,
- GPG_ERR_INV_SEXP = 83,
- GPG_ERR_UNSUPPORTED_ALGORITHM = 84,
- GPG_ERR_NO_PIN_ENTRY = 85,
- GPG_ERR_PIN_ENTRY = 86,
- GPG_ERR_BAD_PIN = 87,
- GPG_ERR_INV_NAME = 88,
- GPG_ERR_BAD_DATA = 89,
- GPG_ERR_INV_PARAMETER = 90,
- GPG_ERR_WRONG_CARD = 91,
- GPG_ERR_NO_DIRMNGR = 92,
- GPG_ERR_DIRMNGR = 93,
- GPG_ERR_CERT_REVOKED = 94,
- GPG_ERR_NO_CRL_KNOWN = 95,
- GPG_ERR_CRL_TOO_OLD = 96,
- GPG_ERR_LINE_TOO_LONG = 97,
- GPG_ERR_NOT_TRUSTED = 98,
- GPG_ERR_CANCELED = 99,
- GPG_ERR_BAD_CA_CERT = 100,
- GPG_ERR_CERT_EXPIRED = 101,
- GPG_ERR_CERT_TOO_YOUNG = 102,
- GPG_ERR_UNSUPPORTED_CERT = 103,
- GPG_ERR_UNKNOWN_SEXP = 104,
- GPG_ERR_UNSUPPORTED_PROTECTION = 105,
- GPG_ERR_CORRUPTED_PROTECTION = 106,
- GPG_ERR_AMBIGUOUS_NAME = 107,
- GPG_ERR_CARD = 108,
- GPG_ERR_CARD_RESET = 109,
- GPG_ERR_CARD_REMOVED = 110,
- GPG_ERR_INV_CARD = 111,
- GPG_ERR_CARD_NOT_PRESENT = 112,
- GPG_ERR_NO_PKCS15_APP = 113,
- GPG_ERR_NOT_CONFIRMED = 114,
- GPG_ERR_CONFIGURATION = 115,
- GPG_ERR_NO_POLICY_MATCH = 116,
- GPG_ERR_INV_INDEX = 117,
- GPG_ERR_INV_ID = 118,
- GPG_ERR_NO_SCDAEMON = 119,
- GPG_ERR_SCDAEMON = 120,
- GPG_ERR_UNSUPPORTED_PROTOCOL = 121,
- GPG_ERR_BAD_PIN_METHOD = 122,
- GPG_ERR_CARD_NOT_INITIALIZED = 123,
- GPG_ERR_UNSUPPORTED_OPERATION = 124,
- GPG_ERR_WRONG_KEY_USAGE = 125,
- GPG_ERR_NOTHING_FOUND = 126,
- GPG_ERR_WRONG_BLOB_TYPE = 127,
- GPG_ERR_MISSING_VALUE = 128,
- GPG_ERR_HARDWARE = 129,
- GPG_ERR_PIN_BLOCKED = 130,
- GPG_ERR_USE_CONDITIONS = 131,
- GPG_ERR_PIN_NOT_SYNCED = 132,
- GPG_ERR_INV_CRL = 133,
- GPG_ERR_BAD_BER = 134,
- GPG_ERR_INV_BER = 135,
- GPG_ERR_ELEMENT_NOT_FOUND = 136,
- GPG_ERR_IDENTIFIER_NOT_FOUND = 137,
- GPG_ERR_INV_TAG = 138,
- GPG_ERR_INV_LENGTH = 139,
- GPG_ERR_INV_KEYINFO = 140,
- GPG_ERR_UNEXPECTED_TAG = 141,
- GPG_ERR_NOT_DER_ENCODED = 142,
- GPG_ERR_NO_CMS_OBJ = 143,
- GPG_ERR_INV_CMS_OBJ = 144,
- GPG_ERR_UNKNOWN_CMS_OBJ = 145,
- GPG_ERR_UNSUPPORTED_CMS_OBJ = 146,
- GPG_ERR_UNSUPPORTED_ENCODING = 147,
- GPG_ERR_UNSUPPORTED_CMS_VERSION = 148,
- GPG_ERR_UNKNOWN_ALGORITHM = 149,
- GPG_ERR_INV_ENGINE = 150,
- GPG_ERR_PUBKEY_NOT_TRUSTED = 151,
- GPG_ERR_DECRYPT_FAILED = 152,
- GPG_ERR_KEY_EXPIRED = 153,
- GPG_ERR_SIG_EXPIRED = 154,
- GPG_ERR_ENCODING_PROBLEM = 155,
- GPG_ERR_INV_STATE = 156,
- GPG_ERR_DUP_VALUE = 157,
- GPG_ERR_MISSING_ACTION = 158,
- GPG_ERR_MODULE_NOT_FOUND = 159,
- GPG_ERR_INV_OID_STRING = 160,
- GPG_ERR_INV_TIME = 161,
- GPG_ERR_INV_CRL_OBJ = 162,
- GPG_ERR_UNSUPPORTED_CRL_VERSION = 163,
- GPG_ERR_INV_CERT_OBJ = 164,
- GPG_ERR_UNKNOWN_NAME = 165,
- GPG_ERR_LOCALE_PROBLEM = 166,
- GPG_ERR_NOT_LOCKED = 167,
- GPG_ERR_PROTOCOL_VIOLATION = 168,
- GPG_ERR_INV_MAC = 169,
- GPG_ERR_INV_REQUEST = 170,
- GPG_ERR_UNKNOWN_EXTN = 171,
- GPG_ERR_UNKNOWN_CRIT_EXTN = 172,
- GPG_ERR_LOCKED = 173,
- GPG_ERR_UNKNOWN_OPTION = 174,
- GPG_ERR_UNKNOWN_COMMAND = 175,
- GPG_ERR_NOT_OPERATIONAL = 176,
- GPG_ERR_NO_PASSPHRASE = 177,
- GPG_ERR_NO_PIN = 178,
- GPG_ERR_NOT_ENABLED = 179,
- GPG_ERR_NO_ENGINE = 180,
- GPG_ERR_MISSING_KEY = 181,
- GPG_ERR_TOO_MANY = 182,
- GPG_ERR_LIMIT_REACHED = 183,
- GPG_ERR_NOT_INITIALIZED = 184,
- GPG_ERR_MISSING_ISSUER_CERT = 185,
- GPG_ERR_NO_KEYSERVER = 186,
- GPG_ERR_INV_CURVE = 187,
- GPG_ERR_UNKNOWN_CURVE = 188,
- GPG_ERR_DUP_KEY = 189,
- GPG_ERR_AMBIGUOUS = 190,
- GPG_ERR_NO_CRYPT_CTX = 191,
- GPG_ERR_WRONG_CRYPT_CTX = 192,
- GPG_ERR_BAD_CRYPT_CTX = 193,
- GPG_ERR_CRYPT_CTX_CONFLICT = 194,
- GPG_ERR_BROKEN_PUBKEY = 195,
- GPG_ERR_BROKEN_SECKEY = 196,
- GPG_ERR_MAC_ALGO = 197,
- GPG_ERR_FULLY_CANCELED = 198,
- GPG_ERR_UNFINISHED = 199,
- GPG_ERR_BUFFER_TOO_SHORT = 200,
- GPG_ERR_SEXP_INV_LEN_SPEC = 201,
- GPG_ERR_SEXP_STRING_TOO_LONG = 202,
- GPG_ERR_SEXP_UNMATCHED_PAREN = 203,
- GPG_ERR_SEXP_NOT_CANONICAL = 204,
- GPG_ERR_SEXP_BAD_CHARACTER = 205,
- GPG_ERR_SEXP_BAD_QUOTATION = 206,
- GPG_ERR_SEXP_ZERO_PREFIX = 207,
- GPG_ERR_SEXP_NESTED_DH = 208,
- GPG_ERR_SEXP_UNMATCHED_DH = 209,
- GPG_ERR_SEXP_UNEXPECTED_PUNC = 210,
- GPG_ERR_SEXP_BAD_HEX_CHAR = 211,
- GPG_ERR_SEXP_ODD_HEX_NUMBERS = 212,
- GPG_ERR_SEXP_BAD_OCT_CHAR = 213,
- GPG_ERR_KEY_ON_CARD = 253,
- GPG_ERR_INV_LOCK_OBJ = 254,
- GPG_ERR_ASS_GENERAL = 257,
- GPG_ERR_ASS_ACCEPT_FAILED = 258,
- GPG_ERR_ASS_CONNECT_FAILED = 259,
- GPG_ERR_ASS_INV_RESPONSE = 260,
- GPG_ERR_ASS_INV_VALUE = 261,
- GPG_ERR_ASS_INCOMPLETE_LINE = 262,
- GPG_ERR_ASS_LINE_TOO_LONG = 263,
- GPG_ERR_ASS_NESTED_COMMANDS = 264,
- GPG_ERR_ASS_NO_DATA_CB = 265,
- GPG_ERR_ASS_NO_INQUIRE_CB = 266,
- GPG_ERR_ASS_NOT_A_SERVER = 267,
- GPG_ERR_ASS_NOT_A_CLIENT = 268,
- GPG_ERR_ASS_SERVER_START = 269,
- GPG_ERR_ASS_READ_ERROR = 270,
- GPG_ERR_ASS_WRITE_ERROR = 271,
- GPG_ERR_ASS_TOO_MUCH_DATA = 273,
- GPG_ERR_ASS_UNEXPECTED_CMD = 274,
- GPG_ERR_ASS_UNKNOWN_CMD = 275,
- GPG_ERR_ASS_SYNTAX = 276,
- GPG_ERR_ASS_CANCELED = 277,
- GPG_ERR_ASS_NO_INPUT = 278,
- GPG_ERR_ASS_NO_OUTPUT = 279,
- GPG_ERR_ASS_PARAMETER = 280,
- GPG_ERR_ASS_UNKNOWN_INQUIRE = 281,
- GPG_ERR_USER_1 = 1024,
- GPG_ERR_USER_2 = 1025,
- GPG_ERR_USER_3 = 1026,
- GPG_ERR_USER_4 = 1027,
- GPG_ERR_USER_5 = 1028,
- GPG_ERR_USER_6 = 1029,
- GPG_ERR_USER_7 = 1030,
- GPG_ERR_USER_8 = 1031,
- GPG_ERR_USER_9 = 1032,
- GPG_ERR_USER_10 = 1033,
- GPG_ERR_USER_11 = 1034,
- GPG_ERR_USER_12 = 1035,
- GPG_ERR_USER_13 = 1036,
- GPG_ERR_USER_14 = 1037,
- GPG_ERR_USER_15 = 1038,
- GPG_ERR_USER_16 = 1039,
- GPG_ERR_MISSING_ERRNO = 16381,
- GPG_ERR_UNKNOWN_ERRNO = 16382,
- GPG_ERR_EOF = 16383,
-
- /* The following error codes are used to map system errors. */
-#define GPG_ERR_SYSTEM_ERROR (1 << 15)
- GPG_ERR_E2BIG = GPG_ERR_SYSTEM_ERROR | 0,
- GPG_ERR_EACCES = GPG_ERR_SYSTEM_ERROR | 1,
- GPG_ERR_EADDRINUSE = GPG_ERR_SYSTEM_ERROR | 2,
- GPG_ERR_EADDRNOTAVAIL = GPG_ERR_SYSTEM_ERROR | 3,
- GPG_ERR_EADV = GPG_ERR_SYSTEM_ERROR | 4,
- GPG_ERR_EAFNOSUPPORT = GPG_ERR_SYSTEM_ERROR | 5,
- GPG_ERR_EAGAIN = GPG_ERR_SYSTEM_ERROR | 6,
- GPG_ERR_EALREADY = GPG_ERR_SYSTEM_ERROR | 7,
- GPG_ERR_EAUTH = GPG_ERR_SYSTEM_ERROR | 8,
- GPG_ERR_EBACKGROUND = GPG_ERR_SYSTEM_ERROR | 9,
- GPG_ERR_EBADE = GPG_ERR_SYSTEM_ERROR | 10,
- GPG_ERR_EBADF = GPG_ERR_SYSTEM_ERROR | 11,
- GPG_ERR_EBADFD = GPG_ERR_SYSTEM_ERROR | 12,
- GPG_ERR_EBADMSG = GPG_ERR_SYSTEM_ERROR | 13,
- GPG_ERR_EBADR = GPG_ERR_SYSTEM_ERROR | 14,
- GPG_ERR_EBADRPC = GPG_ERR_SYSTEM_ERROR | 15,
- GPG_ERR_EBADRQC = GPG_ERR_SYSTEM_ERROR | 16,
- GPG_ERR_EBADSLT = GPG_ERR_SYSTEM_ERROR | 17,
- GPG_ERR_EBFONT = GPG_ERR_SYSTEM_ERROR | 18,
- GPG_ERR_EBUSY = GPG_ERR_SYSTEM_ERROR | 19,
- GPG_ERR_ECANCELED = GPG_ERR_SYSTEM_ERROR | 20,
- GPG_ERR_ECHILD = GPG_ERR_SYSTEM_ERROR | 21,
- GPG_ERR_ECHRNG = GPG_ERR_SYSTEM_ERROR | 22,
- GPG_ERR_ECOMM = GPG_ERR_SYSTEM_ERROR | 23,
- GPG_ERR_ECONNABORTED = GPG_ERR_SYSTEM_ERROR | 24,
- GPG_ERR_ECONNREFUSED = GPG_ERR_SYSTEM_ERROR | 25,
- GPG_ERR_ECONNRESET = GPG_ERR_SYSTEM_ERROR | 26,
- GPG_ERR_ED = GPG_ERR_SYSTEM_ERROR | 27,
- GPG_ERR_EDEADLK = GPG_ERR_SYSTEM_ERROR | 28,
- GPG_ERR_EDEADLOCK = GPG_ERR_SYSTEM_ERROR | 29,
- GPG_ERR_EDESTADDRREQ = GPG_ERR_SYSTEM_ERROR | 30,
- GPG_ERR_EDIED = GPG_ERR_SYSTEM_ERROR | 31,
- GPG_ERR_EDOM = GPG_ERR_SYSTEM_ERROR | 32,
- GPG_ERR_EDOTDOT = GPG_ERR_SYSTEM_ERROR | 33,
- GPG_ERR_EDQUOT = GPG_ERR_SYSTEM_ERROR | 34,
- GPG_ERR_EEXIST = GPG_ERR_SYSTEM_ERROR | 35,
- GPG_ERR_EFAULT = GPG_ERR_SYSTEM_ERROR | 36,
- GPG_ERR_EFBIG = GPG_ERR_SYSTEM_ERROR | 37,
- GPG_ERR_EFTYPE = GPG_ERR_SYSTEM_ERROR | 38,
- GPG_ERR_EGRATUITOUS = GPG_ERR_SYSTEM_ERROR | 39,
- GPG_ERR_EGREGIOUS = GPG_ERR_SYSTEM_ERROR | 40,
- GPG_ERR_EHOSTDOWN = GPG_ERR_SYSTEM_ERROR | 41,
- GPG_ERR_EHOSTUNREACH = GPG_ERR_SYSTEM_ERROR | 42,
- GPG_ERR_EIDRM = GPG_ERR_SYSTEM_ERROR | 43,
- GPG_ERR_EIEIO = GPG_ERR_SYSTEM_ERROR | 44,
- GPG_ERR_EILSEQ = GPG_ERR_SYSTEM_ERROR | 45,
- GPG_ERR_EINPROGRESS = GPG_ERR_SYSTEM_ERROR | 46,
- GPG_ERR_EINTR = GPG_ERR_SYSTEM_ERROR | 47,
- GPG_ERR_EINVAL = GPG_ERR_SYSTEM_ERROR | 48,
- GPG_ERR_EIO = GPG_ERR_SYSTEM_ERROR | 49,
- GPG_ERR_EISCONN = GPG_ERR_SYSTEM_ERROR | 50,
- GPG_ERR_EISDIR = GPG_ERR_SYSTEM_ERROR | 51,
- GPG_ERR_EISNAM = GPG_ERR_SYSTEM_ERROR | 52,
- GPG_ERR_EL2HLT = GPG_ERR_SYSTEM_ERROR | 53,
- GPG_ERR_EL2NSYNC = GPG_ERR_SYSTEM_ERROR | 54,
- GPG_ERR_EL3HLT = GPG_ERR_SYSTEM_ERROR | 55,
- GPG_ERR_EL3RST = GPG_ERR_SYSTEM_ERROR | 56,
- GPG_ERR_ELIBACC = GPG_ERR_SYSTEM_ERROR | 57,
- GPG_ERR_ELIBBAD = GPG_ERR_SYSTEM_ERROR | 58,
- GPG_ERR_ELIBEXEC = GPG_ERR_SYSTEM_ERROR | 59,
- GPG_ERR_ELIBMAX = GPG_ERR_SYSTEM_ERROR | 60,
- GPG_ERR_ELIBSCN = GPG_ERR_SYSTEM_ERROR | 61,
- GPG_ERR_ELNRNG = GPG_ERR_SYSTEM_ERROR | 62,
- GPG_ERR_ELOOP = GPG_ERR_SYSTEM_ERROR | 63,
- GPG_ERR_EMEDIUMTYPE = GPG_ERR_SYSTEM_ERROR | 64,
- GPG_ERR_EMFILE = GPG_ERR_SYSTEM_ERROR | 65,
- GPG_ERR_EMLINK = GPG_ERR_SYSTEM_ERROR | 66,
- GPG_ERR_EMSGSIZE = GPG_ERR_SYSTEM_ERROR | 67,
- GPG_ERR_EMULTIHOP = GPG_ERR_SYSTEM_ERROR | 68,
- GPG_ERR_ENAMETOOLONG = GPG_ERR_SYSTEM_ERROR | 69,
- GPG_ERR_ENAVAIL = GPG_ERR_SYSTEM_ERROR | 70,
- GPG_ERR_ENEEDAUTH = GPG_ERR_SYSTEM_ERROR | 71,
- GPG_ERR_ENETDOWN = GPG_ERR_SYSTEM_ERROR | 72,
- GPG_ERR_ENETRESET = GPG_ERR_SYSTEM_ERROR | 73,
- GPG_ERR_ENETUNREACH = GPG_ERR_SYSTEM_ERROR | 74,
- GPG_ERR_ENFILE = GPG_ERR_SYSTEM_ERROR | 75,
- GPG_ERR_ENOANO = GPG_ERR_SYSTEM_ERROR | 76,
- GPG_ERR_ENOBUFS = GPG_ERR_SYSTEM_ERROR | 77,
- GPG_ERR_ENOCSI = GPG_ERR_SYSTEM_ERROR | 78,
- GPG_ERR_ENODATA = GPG_ERR_SYSTEM_ERROR | 79,
- GPG_ERR_ENODEV = GPG_ERR_SYSTEM_ERROR | 80,
- GPG_ERR_ENOENT = GPG_ERR_SYSTEM_ERROR | 81,
- GPG_ERR_ENOEXEC = GPG_ERR_SYSTEM_ERROR | 82,
- GPG_ERR_ENOLCK = GPG_ERR_SYSTEM_ERROR | 83,
- GPG_ERR_ENOLINK = GPG_ERR_SYSTEM_ERROR | 84,
- GPG_ERR_ENOMEDIUM = GPG_ERR_SYSTEM_ERROR | 85,
- GPG_ERR_ENOMEM = GPG_ERR_SYSTEM_ERROR | 86,
- GPG_ERR_ENOMSG = GPG_ERR_SYSTEM_ERROR | 87,
- GPG_ERR_ENONET = GPG_ERR_SYSTEM_ERROR | 88,
- GPG_ERR_ENOPKG = GPG_ERR_SYSTEM_ERROR | 89,
- GPG_ERR_ENOPROTOOPT = GPG_ERR_SYSTEM_ERROR | 90,
- GPG_ERR_ENOSPC = GPG_ERR_SYSTEM_ERROR | 91,
- GPG_ERR_ENOSR = GPG_ERR_SYSTEM_ERROR | 92,
- GPG_ERR_ENOSTR = GPG_ERR_SYSTEM_ERROR | 93,
- GPG_ERR_ENOSYS = GPG_ERR_SYSTEM_ERROR | 94,
- GPG_ERR_ENOTBLK = GPG_ERR_SYSTEM_ERROR | 95,
- GPG_ERR_ENOTCONN = GPG_ERR_SYSTEM_ERROR | 96,
- GPG_ERR_ENOTDIR = GPG_ERR_SYSTEM_ERROR | 97,
- GPG_ERR_ENOTEMPTY = GPG_ERR_SYSTEM_ERROR | 98,
- GPG_ERR_ENOTNAM = GPG_ERR_SYSTEM_ERROR | 99,
- GPG_ERR_ENOTSOCK = GPG_ERR_SYSTEM_ERROR | 100,
- GPG_ERR_ENOTSUP = GPG_ERR_SYSTEM_ERROR | 101,
- GPG_ERR_ENOTTY = GPG_ERR_SYSTEM_ERROR | 102,
- GPG_ERR_ENOTUNIQ = GPG_ERR_SYSTEM_ERROR | 103,
- GPG_ERR_ENXIO = GPG_ERR_SYSTEM_ERROR | 104,
- GPG_ERR_EOPNOTSUPP = GPG_ERR_SYSTEM_ERROR | 105,
- GPG_ERR_EOVERFLOW = GPG_ERR_SYSTEM_ERROR | 106,
- GPG_ERR_EPERM = GPG_ERR_SYSTEM_ERROR | 107,
- GPG_ERR_EPFNOSUPPORT = GPG_ERR_SYSTEM_ERROR | 108,
- GPG_ERR_EPIPE = GPG_ERR_SYSTEM_ERROR | 109,
- GPG_ERR_EPROCLIM = GPG_ERR_SYSTEM_ERROR | 110,
- GPG_ERR_EPROCUNAVAIL = GPG_ERR_SYSTEM_ERROR | 111,
- GPG_ERR_EPROGMISMATCH = GPG_ERR_SYSTEM_ERROR | 112,
- GPG_ERR_EPROGUNAVAIL = GPG_ERR_SYSTEM_ERROR | 113,
- GPG_ERR_EPROTO = GPG_ERR_SYSTEM_ERROR | 114,
- GPG_ERR_EPROTONOSUPPORT = GPG_ERR_SYSTEM_ERROR | 115,
- GPG_ERR_EPROTOTYPE = GPG_ERR_SYSTEM_ERROR | 116,
- GPG_ERR_ERANGE = GPG_ERR_SYSTEM_ERROR | 117,
- GPG_ERR_EREMCHG = GPG_ERR_SYSTEM_ERROR | 118,
- GPG_ERR_EREMOTE = GPG_ERR_SYSTEM_ERROR | 119,
- GPG_ERR_EREMOTEIO = GPG_ERR_SYSTEM_ERROR | 120,
- GPG_ERR_ERESTART = GPG_ERR_SYSTEM_ERROR | 121,
- GPG_ERR_EROFS = GPG_ERR_SYSTEM_ERROR | 122,
- GPG_ERR_ERPCMISMATCH = GPG_ERR_SYSTEM_ERROR | 123,
- GPG_ERR_ESHUTDOWN = GPG_ERR_SYSTEM_ERROR | 124,
- GPG_ERR_ESOCKTNOSUPPORT = GPG_ERR_SYSTEM_ERROR | 125,
- GPG_ERR_ESPIPE = GPG_ERR_SYSTEM_ERROR | 126,
- GPG_ERR_ESRCH = GPG_ERR_SYSTEM_ERROR | 127,
- GPG_ERR_ESRMNT = GPG_ERR_SYSTEM_ERROR | 128,
- GPG_ERR_ESTALE = GPG_ERR_SYSTEM_ERROR | 129,
- GPG_ERR_ESTRPIPE = GPG_ERR_SYSTEM_ERROR | 130,
- GPG_ERR_ETIME = GPG_ERR_SYSTEM_ERROR | 131,
- GPG_ERR_ETIMEDOUT = GPG_ERR_SYSTEM_ERROR | 132,
- GPG_ERR_ETOOMANYREFS = GPG_ERR_SYSTEM_ERROR | 133,
- GPG_ERR_ETXTBSY = GPG_ERR_SYSTEM_ERROR | 134,
- GPG_ERR_EUCLEAN = GPG_ERR_SYSTEM_ERROR | 135,
- GPG_ERR_EUNATCH = GPG_ERR_SYSTEM_ERROR | 136,
- GPG_ERR_EUSERS = GPG_ERR_SYSTEM_ERROR | 137,
- GPG_ERR_EWOULDBLOCK = GPG_ERR_SYSTEM_ERROR | 138,
- GPG_ERR_EXDEV = GPG_ERR_SYSTEM_ERROR | 139,
- GPG_ERR_EXFULL = GPG_ERR_SYSTEM_ERROR | 140,
-
- /* This is one more than the largest allowed entry. */
- GPG_ERR_CODE_DIM = 65536
- } gpg_err_code_t;
-
-
-/* The error value type gpg_error_t. */
-
-/* We would really like to use bit-fields in a struct, but using
- structs as return values can cause binary compatibility issues, in
- particular if you want to do it effeciently (also see
- -freg-struct-return option to GCC). */
-typedef unsigned int gpg_error_t;
-
-/* We use the lowest 16 bits of gpg_error_t for error codes. The 16th
- bit indicates system errors. */
-#define GPG_ERR_CODE_MASK (GPG_ERR_CODE_DIM - 1)
-
-/* Bits 17 to 24 are reserved. */
-
-/* We use the upper 7 bits of gpg_error_t for error sources. */
-#define GPG_ERR_SOURCE_MASK (GPG_ERR_SOURCE_DIM - 1)
-#define GPG_ERR_SOURCE_SHIFT 24
-
-/* The highest bit is reserved. It shouldn't be used to prevent
- potential negative numbers when transmitting error values as
- text. */
-
-
-/* GCC feature test. */
-#undef _GPG_ERR_HAVE_CONSTRUCTOR
-#if __GNUC__
-#define _GPG_ERR_GCC_VERSION (__GNUC__ * 10000 \
- + __GNUC_MINOR__ * 100 \
- + __GNUC_PATCHLEVEL__)
-
-#if _GPG_ERR_GCC_VERSION > 30100
-#define _GPG_ERR_CONSTRUCTOR __attribute__ ((__constructor__))
-#define _GPG_ERR_HAVE_CONSTRUCTOR
-#endif
-#endif
-
-#ifndef _GPG_ERR_CONSTRUCTOR
-#define _GPG_ERR_CONSTRUCTOR
-#endif
-
-
-/* Initialization function. */
-
-/* Initialize the library. This function should be run early. */
-gpg_error_t gpg_err_init (void) _GPG_ERR_CONSTRUCTOR;
-
-/* If this is defined, the library is already initialized by the
- constructor and does not need to be initialized explicitely. */
-#undef GPG_ERR_INITIALIZED
-#ifdef _GPG_ERR_HAVE_CONSTRUCTOR
-#define GPG_ERR_INITIALIZED 1
-#endif
-
-/* See the source on how to use the deinit function; it is usually not
- required. */
-void gpg_err_deinit (int mode);
-
-
-/* Constructor and accessor functions. */
-
-/* Construct an error value from an error code and source. Within a
- subsystem, use gpg_error. */
-static GPG_ERR_INLINE gpg_error_t
-gpg_err_make (gpg_err_source_t source, gpg_err_code_t code)
-{
- return code == GPG_ERR_NO_ERROR ? GPG_ERR_NO_ERROR
- : (((source & GPG_ERR_SOURCE_MASK) << GPG_ERR_SOURCE_SHIFT)
- | (code & GPG_ERR_CODE_MASK));
-}
-
-
-/* The user should define GPG_ERR_SOURCE_DEFAULT before including this
- file to specify a default source for gpg_error. */
-#ifndef GPG_ERR_SOURCE_DEFAULT
-#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_UNKNOWN
-#endif
-
-static GPG_ERR_INLINE gpg_error_t
-gpg_error (gpg_err_code_t code)
-{
- return gpg_err_make (GPG_ERR_SOURCE_DEFAULT, code);
-}
-
-
-/* Retrieve the error code from an error value. */
-static GPG_ERR_INLINE gpg_err_code_t
-gpg_err_code (gpg_error_t err)
-{
- return (gpg_err_code_t) (err & GPG_ERR_CODE_MASK);
-}
-
-
-/* Retrieve the error source from an error value. */
-static GPG_ERR_INLINE gpg_err_source_t
-gpg_err_source (gpg_error_t err)
-{
- return (gpg_err_source_t) ((err >> GPG_ERR_SOURCE_SHIFT)
- & GPG_ERR_SOURCE_MASK);
-}
-
-
-/* String functions. */
-
-/* Return a pointer to a string containing a description of the error
- code in the error value ERR. This function is not thread-safe. */
-const char *gpg_strerror (gpg_error_t err);
-
-/* Return the error string for ERR in the user-supplied buffer BUF of
- size BUFLEN. This function is, in contrast to gpg_strerror,
- thread-safe if a thread-safe strerror_r() function is provided by
- the system. If the function succeeds, 0 is returned and BUF
- contains the string describing the error. If the buffer was not
- large enough, ERANGE is returned and BUF contains as much of the
- beginning of the error string as fits into the buffer. */
-int gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen);
-
-/* Return a pointer to a string containing a description of the error
- source in the error value ERR. */
-const char *gpg_strsource (gpg_error_t err);
-
-
-/* Mapping of system errors (errno). */
-
-/* Retrieve the error code for the system error ERR. This returns
- GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped (report
- this). */
-gpg_err_code_t gpg_err_code_from_errno (int err);
-
-
-/* Retrieve the system error for the error code CODE. This returns 0
- if CODE is not a system error code. */
-int gpg_err_code_to_errno (gpg_err_code_t code);
-
-
-/* Retrieve the error code directly from the ERRNO variable. This
- returns GPG_ERR_UNKNOWN_ERRNO if the system error is not mapped
- (report this) and GPG_ERR_MISSING_ERRNO if ERRNO has the value 0. */
-gpg_err_code_t gpg_err_code_from_syserror (void);
-
-
-/* Set the ERRNO variable. This function is the preferred way to set
- ERRNO due to peculiarities on WindowsCE. */
-void gpg_err_set_errno (int err);
-
-/* Return or check the version. */
-const char *gpg_error_check_version (const char *req_version);
-
-/* The version string of this header. */
-#define GPG_ERROR_VERSION "1.13"
-
-/* The version number of this header. */
-#define GPG_ERROR_VERSION_NUMBER 0x010d00
-
-
-/* Self-documenting convenience functions. */
-
-static GPG_ERR_INLINE gpg_error_t
-gpg_err_make_from_errno (gpg_err_source_t source, int err)
-{
- return gpg_err_make (source, gpg_err_code_from_errno (err));
-}
-
-
-static GPG_ERR_INLINE gpg_error_t
-gpg_error_from_errno (int err)
-{
- return gpg_error (gpg_err_code_from_errno (err));
-}
-
-static GPG_ERR_INLINE gpg_error_t
-gpg_error_from_syserror (void)
-{
- return gpg_error (gpg_err_code_from_syserror ());
-}
-
-
-
-/* Lock functions. */
-
-
-typedef struct
-{
- long _vers;
- union {
- volatile char _priv[40];
- long _x_align;
- long *_xp_align;
- } u;
-} gpgrt_lock_t;
-
-#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0}}}
-
-#define GPGRT_LOCK_DEFINE(name) \
- static gpgrt_lock_t name = GPGRT_LOCK_INITIALIZER
-
-/* NB: If GPGRT_LOCK_DEFINE is not used, zero out the lock variable
- before passing it to gpgrt_lock_init. */
-gpg_err_code_t gpgrt_lock_init (gpgrt_lock_t *lockhd);
-gpg_err_code_t gpgrt_lock_lock (gpgrt_lock_t *lockhd);
-gpg_err_code_t gpgrt_lock_unlock (gpgrt_lock_t *lockhd);
-gpg_err_code_t gpgrt_lock_destroy (gpgrt_lock_t *lockhd);
-
-
-
-/* Thread functions. */
-
-gpg_err_code_t gpgrt_yield (void);
-
-
-
-
-/* Estream */
-
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* GPG_ERROR_H */
-/*
-Local Variables:
-buffer-read-only: t
-End:
-*/
diff --git a/src/gpg-error.h.in b/src/gpg-error.h.in
index 4bd28bf..988898e 100644
--- a/src/gpg-error.h.in
+++ b/src/gpg-error.h.in
@@ -1,43 +1,54 @@
-/* gpg-error.h - Public interface to libgpg-error. -*- c -*-
- Copyright (C) 2003, 2004, 2010, 2013, 2014 g10 Code GmbH
-
- This file is part of libgpg-error.
-
- libgpg-error is free software; you can redistribute it 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.
-
- libgpg-error is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
-
- @configure_input@
+/* gpg-error.h or gpgrt.h - Public interface to libgpg-error. -*- c -*-
+ * Copyright (C) 2003-2004, 2010, 2013-2017 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ *
+ * @configure_input@
*/
-
#ifndef GPG_ERROR_H
-#define GPG_ERROR_H 1
+#define GPG_ERROR_H 1
+#ifndef GPGRT_H
+#define GPGRT_H 1
#include <stddef.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+/* The version string of this header. */
+#define GPG_ERROR_VERSION @version@
+#define GPGRT_VERSION @version@
+
+/* The version number of this header. */
+#define GPG_ERROR_VERSION_NUMBER @version-number@
+#define GPGRT_VERSION_NUMBER @version-number@
+
#ifdef __GNUC__
-#define GPG_ERR_INLINE __inline__
-#elif _MSC_VER >= 1300
-#define GPG_ERR_INLINE __inline
-#elif __STDC_VERSION__ >= 199901L
-#define GPG_ERR_INLINE inline
+# define GPG_ERR_INLINE __inline__
+#elif defined(_MSC_VER) && _MSC_VER >= 1300
+# define GPG_ERR_INLINE __inline
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+# define GPG_ERR_INLINE inline
#else
-#ifndef GPG_ERR_INLINE
-#define GPG_ERR_INLINE
-#endif
+# ifndef GPG_ERR_INLINE
+# define GPG_ERR_INLINE
+# endif
#endif
-
#ifdef __cplusplus
extern "C" {
#if 0 /* just to make Emacs auto-indent happy */
@@ -68,6 +79,9 @@ extern "C" {
internal gettext API to standard names. This has only an effect on
Windows platforms.
+ GPGRT_ENABLE_ES_MACROS: Define to provide "es_" macros for the
+ estream functions.
+
In addition to the error codes, Libgpg-error also provides a set of
functions used by most GnuPG components. */
@@ -83,7 +97,6 @@ extern "C" {
typedef enum
{
@include:err-sources@
-
/* This is one more than the largest allowed entry. */
GPG_ERR_SOURCE_DIM = 128
} gpg_err_source_t;
@@ -96,11 +109,9 @@ typedef enum
typedef enum
{
@include:err-codes@
-
/* The following error codes are used to map system errors. */
#define GPG_ERR_SYSTEM_ERROR (1 << 15)
@include:errnos@
-
/* This is one more than the largest allowed entry. */
GPG_ERR_CODE_DIM = 65536
} gpg_err_code_t;
@@ -110,7 +121,7 @@ typedef enum
/* We would really like to use bit-fields in a struct, but using
structs as return values can cause binary compatibility issues, in
- particular if you want to do it effeciently (also see
+ particular if you want to do it efficiently (also see
-freg-struct-return option to GCC). */
typedef unsigned int gpg_error_t;
@@ -130,22 +141,147 @@ typedef unsigned int gpg_error_t;
/* GCC feature test. */
-#undef _GPG_ERR_HAVE_CONSTRUCTOR
#if __GNUC__
-#define _GPG_ERR_GCC_VERSION (__GNUC__ * 10000 \
- + __GNUC_MINOR__ * 100 \
- + __GNUC_PATCHLEVEL__)
+# define _GPG_ERR_GCC_VERSION (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+#else
+# define _GPG_ERR_GCC_VERSION 0
+#endif
+#undef _GPG_ERR_HAVE_CONSTRUCTOR
#if _GPG_ERR_GCC_VERSION > 30100
-#define _GPG_ERR_CONSTRUCTOR __attribute__ ((__constructor__))
-#define _GPG_ERR_HAVE_CONSTRUCTOR
+# define _GPG_ERR_CONSTRUCTOR __attribute__ ((__constructor__))
+# define _GPG_ERR_HAVE_CONSTRUCTOR
+#else
+# define _GPG_ERR_CONSTRUCTOR
+#endif
+
+#define GPGRT_GCC_VERSION _GPG_ERR_GCC_VERSION
+
+#if _GPG_ERR_GCC_VERSION >= 29200
+# define _GPGRT__RESTRICT __restrict__
+#else
+# define _GPGRT__RESTRICT
+#endif
+
+/* The noreturn attribute. */
+#if _GPG_ERR_GCC_VERSION >= 20500
+# define GPGRT_ATTR_NORETURN __attribute__ ((noreturn))
+#else
+# define GPGRT_ATTR_NORETURN
+#endif
+
+/* The printf attributes. */
+#if _GPG_ERR_GCC_VERSION >= 40400
+# define GPGRT_ATTR_PRINTF(f, a) \
+ __attribute__ ((format(__gnu_printf__,f,a)))
+# define GPGRT_ATTR_NR_PRINTF(f, a) \
+ __attribute__ ((noreturn, format(__gnu_printf__,f,a)))
+#elif _GPG_ERR_GCC_VERSION >= 20500
+# define GPGRT_ATTR_PRINTF(f, a) \
+ __attribute__ ((format(printf,f,a)))
+# define GPGRT_ATTR_NR_PRINTF(f, a) \
+ __attribute__ ((noreturn, format(printf,f,a)))
+#else
+# define GPGRT_ATTR_PRINTF(f, a)
+# define GPGRT_ATTR_NR_PRINTF(f, a)
+#endif
+#if _GPG_ERR_GCC_VERSION >= 20800
+# define GPGRT_ATTR_FORMAT_ARG(a) __attribute__ ((__format_arg__ (a)))
+#else
+# define GPGRT_ATTR_FORMAT_ARG(a)
+#endif
+
+/* The sentinel attribute. */
+#if _GPG_ERR_GCC_VERSION >= 40000
+# define GPGRT_ATTR_SENTINEL(a) __attribute__ ((sentinel(a)))
+#else
+# define GPGRT_ATTR_SENTINEL(a)
+#endif
+
+/* The used and unused attributes.
+ I am not sure since when the unused attribute is really supported.
+ In any case it it only needed for gcc versions which print a
+ warning. Thus let us require gcc >= 3.5. */
+#if _GPG_ERR_GCC_VERSION >= 40000
+# define GPGRT_ATTR_USED __attribute__ ((used))
+#else
+# define GPGRT_ATTR_USED
+#endif
+#if _GPG_ERR_GCC_VERSION >= 30500
+# define GPGRT_ATTR_UNUSED __attribute__ ((unused))
+#else
+# define GPGRT_ATTR_UNUSED
+#endif
+
+/* The deprecated attribute. */
+#if _GPG_ERR_GCC_VERSION >= 30100
+# define GPGRT_ATTR_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define GPGRT_ATTR_DEPRECATED
+#endif
+
+/* The pure attribute. */
+#if _GPG_ERR_GCC_VERSION >= 29600
+# define GPGRT_ATTR_PURE __attribute__ ((__pure__))
+#else
+# define GPGRT_ATTR_PURE
+#endif
+
+/* The malloc attribute. */
+#if _GPG_ERR_GCC_VERSION >= 30200
+# define GPGRT_ATTR_MALLOC __attribute__ ((__malloc__))
+#else
+# define GPGRT_ATTR_MALLOC
+#endif
+
+/* A macro defined if a GCC style __FUNCTION__ macro is available. */
+#undef GPGRT_HAVE_MACRO_FUNCTION
+#if _GPG_ERR_GCC_VERSION >= 20500
+# define GPGRT_HAVE_MACRO_FUNCTION 1
#endif
+
+/* A macro defined if the pragma GCC push_options is available. */
+#undef GPGRT_HAVE_PRAGMA_GCC_PUSH
+#if _GPG_ERR_GCC_VERSION >= 40400
+# define GPGRT_HAVE_PRAGMA_GCC_PUSH 1
#endif
-#ifndef _GPG_ERR_CONSTRUCTOR
-#define _GPG_ERR_CONSTRUCTOR
+/* Detect LeakSanitizer (LSan) support for GCC and Clang based on
+ * whether AddressSanitizer (ASAN) is enabled via -fsanitize=address).
+ * Note that -fsanitize=leak just affect the linker options which
+ * cannot be detected here. In that case you have to define the
+ * GPGRT_HAVE_LEAK_SANITIZER macro manually. */
+#ifdef __GNUC__
+# ifdef __SANITIZE_ADDRESS__
+# define GPGRT_HAVE_LEAK_SANITIZER
+# elif defined(__has_feature)
+# if __has_feature(address_sanitizer)
+# define GPGRT_HAVE_LEAK_SANITIZER
+# endif
+# endif
#endif
+
+/* The new name for the inline macro. */
+#define GPGRT_INLINE GPG_ERR_INLINE
+
+#ifdef GPGRT_HAVE_LEAK_SANITIZER
+# include <sanitizer/lsan_interface.h>
+#endif
+
+/* Mark heap objects as non-leaked memory. */
+static GPGRT_INLINE void
+gpgrt_annotate_leaked_object (const void *p)
+{
+#ifdef GPGRT_HAVE_LEAK_SANITIZER
+ __lsan_ignore_object(p);
+#else
+ (void)p;
+#endif
+}
+
/* Initialization function. */
@@ -156,13 +292,26 @@ gpg_error_t gpg_err_init (void) _GPG_ERR_CONSTRUCTOR;
constructor and does not need to be initialized explicitely. */
#undef GPG_ERR_INITIALIZED
#ifdef _GPG_ERR_HAVE_CONSTRUCTOR
-#define GPG_ERR_INITIALIZED 1
+# define GPG_ERR_INITIALIZED 1
+# define gpgrt_init() do { gpg_err_init (); } while (0)
+#else
+# define gpgrt_init() do { ; } while (0)
#endif
/* See the source on how to use the deinit function; it is usually not
required. */
void gpg_err_deinit (int mode);
+/* Register blocking system I/O clamping functions. */
+void gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void));
+
+/* Get current I/O clamping functions. */
+void gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void));
+
+/* Register a custom malloc/realloc/free function. */
+void gpgrt_set_alloc_func (void *(*f)(void *a, size_t n));
+
+
/* Constructor and accessor functions. */
@@ -250,14 +399,13 @@ gpg_err_code_t gpg_err_code_from_syserror (void);
ERRNO due to peculiarities on WindowsCE. */
void gpg_err_set_errno (int err);
-/* Return or check the version. */
+/* Return or check the version. Both functions are identical. */
+const char *gpgrt_check_version (const char *req_version);
const char *gpg_error_check_version (const char *req_version);
-/* The version string of this header. */
-#define GPG_ERROR_VERSION @version@
-
-/* The version number of this header. */
-#define GPG_ERROR_VERSION_NUMBER @version-number@
+/* System specific type definitions. */
+@define:gpgrt_ssize_t@
+@define:gpgrt_off_t@
@include:os-add@
@@ -295,6 +443,7 @@ gpg_error_from_syserror (void)
before passing it to gpgrt_lock_init. */
gpg_err_code_t gpgrt_lock_init (gpgrt_lock_t *lockhd);
gpg_err_code_t gpgrt_lock_lock (gpgrt_lock_t *lockhd);
+gpg_err_code_t gpgrt_lock_trylock (gpgrt_lock_t *lockhd);
gpg_err_code_t gpgrt_lock_unlock (gpgrt_lock_t *lockhd);
gpg_err_code_t gpgrt_lock_destroy (gpgrt_lock_t *lockhd);
@@ -309,9 +458,416 @@ gpg_err_code_t gpgrt_yield (void);
/* Estream */
+/* The definition of this struct is entirely private. You must not
+ use it for anything. It is only here so some functions can be
+ implemented as macros. */
+struct _gpgrt_stream_internal;
+struct _gpgrt__stream
+{
+ /* The layout of this struct must never change. It may be grown,
+ but only if all functions which access the new members are
+ versioned. */
+
+ /* Various flags. */
+ struct {
+ unsigned int magic: 16;
+ unsigned int writing: 1;
+ unsigned int reserved: 15;
+ } flags;
+
+ /* A pointer to the stream buffer. */
+ unsigned char *buffer;
+
+ /* The size of the buffer in bytes. */
+ size_t buffer_size;
+
+ /* The length of the usable data in the buffer, only valid when in
+ read mode (see flags). */
+ size_t data_len;
+
+ /* The current position of the offset pointer, valid in read and
+ write mode. */
+ size_t data_offset;
+
+ size_t data_flushed;
+ unsigned char *unread_buffer;
+ size_t unread_buffer_size;
+
+ /* The number of unread bytes. */
+ size_t unread_data_len;
+
+ /* A pointer to our internal data for this stream. */
+ struct _gpgrt_stream_internal *intern;
+};
+
+/* The opaque type for an estream. */
+typedef struct _gpgrt__stream *gpgrt_stream_t;
+#ifdef GPGRT_ENABLE_ES_MACROS
+typedef struct _gpgrt__stream *estream_t;
+#endif
+
+typedef @api_ssize_t@ (*gpgrt_cookie_read_function_t) (void *cookie,
+ void *buffer, size_t size);
+typedef @api_ssize_t@ (*gpgrt_cookie_write_function_t) (void *cookie,
+ const void *buffer,
+ size_t size);
+typedef int (*gpgrt_cookie_seek_function_t) (void *cookie,
+ gpgrt_off_t *pos, int whence);
+typedef int (*gpgrt_cookie_close_function_t) (void *cookie);
+
+struct _gpgrt_cookie_io_functions
+{
+ gpgrt_cookie_read_function_t func_read;
+ gpgrt_cookie_write_function_t func_write;
+ gpgrt_cookie_seek_function_t func_seek;
+ gpgrt_cookie_close_function_t func_close;
+};
+typedef struct _gpgrt_cookie_io_functions gpgrt_cookie_io_functions_t;
+#ifdef GPGRT_ENABLE_ES_MACROS
+typedef struct _gpgrt_cookie_io_functions es_cookie_io_functions_t;
+#define es_cookie_read_function_t gpgrt_cookie_read_function_t
+#define es_cookie_write_function_t gpgrt_cookie_read_function_t
+#define es_cookie_seek_function_t gpgrt_cookie_read_function_t
+#define es_cookie_close_function_t gpgrt_cookie_read_function_t
+#endif
+
+enum gpgrt_syshd_types
+ {
+ GPGRT_SYSHD_NONE = 0, /* No system handle available. */
+ GPGRT_SYSHD_FD = 1, /* A file descriptor as returned by open(). */
+ GPGRT_SYSHD_SOCK = 2, /* A socket as returned by socket(). */
+ GPGRT_SYSHD_RVID = 3, /* A rendezvous id (see libassuan's gpgcedev.c). */
+ GPGRT_SYSHD_HANDLE = 4 /* A HANDLE object (Windows). */
+ };
+
+struct _gpgrt_syshd
+{
+ enum gpgrt_syshd_types type;
+ union {
+ int fd;
+ int sock;
+ int rvid;
+ void *handle;
+ } u;
+};
+typedef struct _gpgrt_syshd gpgrt_syshd_t;
+#ifdef GPGRT_ENABLE_ES_MACROS
+typedef struct _gpgrt_syshd es_syshd_t;
+#define ES_SYSHD_NONE GPGRT_SYSHD_NONE
+#define ES_SYSHD_FD GPGRT_SYSHD_FD
+#define ES_SYSHD_SOCK GPGRT_SYSHD_SOCK
+#define ES_SYSHD_RVID GPGRT_SYSHD_RVID
+#define ES_SYSHD_HANDLE GPGRT_SYSHD_HANDLE
+#endif
+
+/* The object used with gpgrt_poll. */
+struct _gpgrt_poll_s
+{
+ gpgrt_stream_t stream;
+ unsigned int want_read:1;
+ unsigned int want_write:1;
+ unsigned int want_oob:1;
+ unsigned int want_rdhup:1;
+ unsigned int _reserv1:4;
+ unsigned int got_read:1;
+ unsigned int got_write:1;
+ unsigned int got_oob:1;
+ unsigned int got_rdhup:1;
+ unsigned int _reserv2:4;
+ unsigned int got_err:1;
+ unsigned int got_hup:1;
+ unsigned int got_nval:1;
+ unsigned int _reserv3:4;
+ unsigned int ignore:1;
+ unsigned int user:8; /* For application use. */
+};
+typedef struct _gpgrt_poll_s gpgrt_poll_t;
+#ifdef GPGRT_ENABLE_ES_MACROS
+typedef struct _gpgrt_poll_s es_poll_t;
+#endif
+
+gpgrt_stream_t gpgrt_fopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t gpgrt_mopen (void *_GPGRT__RESTRICT data,
+ size_t data_n, size_t data_len,
+ unsigned int grow,
+ void *(*func_realloc) (void *mem, size_t size),
+ void (*func_free) (void *mem),
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t gpgrt_fopenmem (size_t memlimit,
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t gpgrt_fopenmem_init (size_t memlimit,
+ const char *_GPGRT__RESTRICT mode,
+ const void *data, size_t datalen);
+gpgrt_stream_t gpgrt_fdopen (int filedes, const char *mode);
+gpgrt_stream_t gpgrt_fdopen_nc (int filedes, const char *mode);
+gpgrt_stream_t gpgrt_sysopen (gpgrt_syshd_t *syshd, const char *mode);
+gpgrt_stream_t gpgrt_sysopen_nc (gpgrt_syshd_t *syshd, const char *mode);
+gpgrt_stream_t gpgrt_fpopen (FILE *fp, const char *mode);
+gpgrt_stream_t gpgrt_fpopen_nc (FILE *fp, const char *mode);
+gpgrt_stream_t gpgrt_freopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+gpgrt_stream_t gpgrt_fopencookie (void *_GPGRT__RESTRICT cookie,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_cookie_io_functions_t functions);
+int gpgrt_fclose (gpgrt_stream_t stream);
+int gpgrt_fclose_snatch (gpgrt_stream_t stream,
+ void **r_buffer, size_t *r_buflen);
+int gpgrt_onclose (gpgrt_stream_t stream, int mode,
+ void (*fnc) (gpgrt_stream_t, void*), void *fnc_value);
+int gpgrt_fileno (gpgrt_stream_t stream);
+int gpgrt_fileno_unlocked (gpgrt_stream_t stream);
+int gpgrt_syshd (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
+int gpgrt_syshd_unlocked (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
+
+void _gpgrt_set_std_fd (int no, int fd);
+gpgrt_stream_t _gpgrt_get_std_stream (int fd);
+
+#define gpgrt_stdin _gpgrt_get_std_stream (0)
+#define gpgrt_stdout _gpgrt_get_std_stream (1)
+#define gpgrt_stderr _gpgrt_get_std_stream (2)
+
+
+void gpgrt_flockfile (gpgrt_stream_t stream);
+int gpgrt_ftrylockfile (gpgrt_stream_t stream);
+void gpgrt_funlockfile (gpgrt_stream_t stream);
+
+int gpgrt_feof (gpgrt_stream_t stream);
+int gpgrt_feof_unlocked (gpgrt_stream_t stream);
+int gpgrt_ferror (gpgrt_stream_t stream);
+int gpgrt_ferror_unlocked (gpgrt_stream_t stream);
+void gpgrt_clearerr (gpgrt_stream_t stream);
+void gpgrt_clearerr_unlocked (gpgrt_stream_t stream);
+
+int _gpgrt_pending (gpgrt_stream_t stream); /* (private) */
+int _gpgrt_pending_unlocked (gpgrt_stream_t stream); /* (private) */
+
+#define gpgrt_pending(stream) _gpgrt_pending (stream)
+
+#define gpgrt_pending_unlocked(stream) \
+ (((!(stream)->flags.writing) \
+ && (((stream)->data_offset < (stream)->data_len) \
+ || ((stream)->unread_data_len))) \
+ ? 1 : _gpgrt_pending_unlocked ((stream)))
+
+int gpgrt_fflush (gpgrt_stream_t stream);
+int gpgrt_fseek (gpgrt_stream_t stream, long int offset, int whence);
+int gpgrt_fseeko (gpgrt_stream_t stream, gpgrt_off_t offset, int whence);
+long int gpgrt_ftell (gpgrt_stream_t stream);
+gpgrt_off_t gpgrt_ftello (gpgrt_stream_t stream);
+void gpgrt_rewind (gpgrt_stream_t stream);
+
+int gpgrt_fgetc (gpgrt_stream_t stream);
+int gpgrt_fputc (int c, gpgrt_stream_t stream);
+
+int _gpgrt_getc_underflow (gpgrt_stream_t stream); /* (private) */
+int _gpgrt_putc_overflow (int c, gpgrt_stream_t stream); /* (private) */
+
+#define gpgrt_getc_unlocked(stream) \
+ (((!(stream)->flags.writing) \
+ && ((stream)->data_offset < (stream)->data_len) \
+ && (! (stream)->unread_data_len)) \
+ ? ((int) (stream)->buffer[((stream)->data_offset)++]) \
+ : _gpgrt_getc_underflow ((stream)))
+
+#define gpgrt_putc_unlocked(c, stream) \
+ (((stream)->flags.writing \
+ && ((stream)->data_offset < (stream)->buffer_size) \
+ && (c != '\n')) \
+ ? ((int) ((stream)->buffer[((stream)->data_offset)++] = (c))) \
+ : _gpgrt_putc_overflow ((c), (stream)))
+
+#define gpgrt_getc(stream) gpgrt_fgetc (stream)
+#define gpgrt_putc(c, stream) gpgrt_fputc (c, stream)
+
+int gpgrt_ungetc (int c, gpgrt_stream_t stream);
+
+int gpgrt_read (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT buffer, size_t bytes_to_read,
+ size_t *_GPGRT__RESTRICT bytes_read);
+int gpgrt_write (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t bytes_to_write,
+ size_t *_GPGRT__RESTRICT bytes_written);
+int gpgrt_write_sanitized (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ const char *delimiters,
+ size_t *_GPGRT__RESTRICT bytes_written);
+int gpgrt_write_hexstring (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ int reserved,
+ size_t *_GPGRT__RESTRICT bytes_written);
+
+size_t gpgrt_fread (void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+size_t gpgrt_fwrite (const void *_GPGRT__RESTRICT ptr, size_t size, size_t memb,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+
+char *gpgrt_fgets (char *_GPGRT__RESTRICT s, int n,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+int gpgrt_fputs (const char *_GPGRT__RESTRICT s,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+int gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+
+@api_ssize_t@ gpgrt_getline (char *_GPGRT__RESTRICT *_GPGRT__RESTRICT lineptr,
+ size_t *_GPGRT__RESTRICT n,
+ gpgrt_stream_t stream);
+@api_ssize_t@ gpgrt_read_line (gpgrt_stream_t stream,
+ char **addr_of_buffer, size_t *length_of_buffer,
+ size_t *max_length);
+void gpgrt_free (void *a);
+
+int gpgrt_fprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(2,3);
+int gpgrt_fprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(2,3);
+
+int gpgrt_printf (const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(1,2);
+int gpgrt_printf_unlocked (const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(1,2);
+
+int gpgrt_vfprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, va_list ap)
+ GPGRT_ATTR_PRINTF(2,0);
+int gpgrt_vfprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, va_list ap)
+ GPGRT_ATTR_PRINTF(2,0);
+
+int gpgrt_setvbuf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buf, int mode, size_t size);
+void gpgrt_setbuf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buf);
+
+void gpgrt_set_binary (gpgrt_stream_t stream);
+int gpgrt_set_nonblock (gpgrt_stream_t stream, int onoff);
+int gpgrt_get_nonblock (gpgrt_stream_t stream);
+
+int gpgrt_poll (gpgrt_poll_t *fdlist, unsigned int nfds, int timeout);
+
+gpgrt_stream_t gpgrt_tmpfile (void);
+
+void gpgrt_opaque_set (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT opaque);
+void *gpgrt_opaque_get (gpgrt_stream_t stream);
+
+void gpgrt_fname_set (gpgrt_stream_t stream, const char *fname);
+const char *gpgrt_fname_get (gpgrt_stream_t stream);
+
+int gpgrt_asprintf (char **r_buf, const char * _GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(2,3);
+int gpgrt_vasprintf (char **r_buf, const char * _GPGRT__RESTRICT format,
+ va_list ap)
+ GPGRT_ATTR_PRINTF(2,0);
+char *gpgrt_bsprintf (const char * _GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(1,2);
+char *gpgrt_vbsprintf (const char * _GPGRT__RESTRICT format, va_list ap)
+ GPGRT_ATTR_PRINTF(1,0);
+int gpgrt_snprintf (char *buf, size_t bufsize,
+ const char * _GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(3,4);
+int gpgrt_vsnprintf (char *buf,size_t bufsize,
+ const char * _GPGRT__RESTRICT format, va_list arg_ptr)
+ GPGRT_ATTR_PRINTF(3,0);
+
+
+#ifdef GPGRT_ENABLE_ES_MACROS
+# define es_fopen gpgrt_fopen
+# define es_mopen gpgrt_mopen
+# define es_fopenmem gpgrt_fopenmem
+# define es_fopenmem_init gpgrt_fopenmem_init
+# define es_fdopen gpgrt_fdopen
+# define es_fdopen_nc gpgrt_fdopen_nc
+# define es_sysopen gpgrt_sysopen
+# define es_sysopen_nc gpgrt_sysopen_nc
+# define es_fpopen gpgrt_fpopen
+# define es_fpopen_nc gpgrt_fpopen_nc
+# define es_freopen gpgrt_freopen
+# define es_fopencookie gpgrt_fopencookie
+# define es_fclose gpgrt_fclose
+# define es_fclose_snatch gpgrt_fclose_snatch
+# define es_onclose gpgrt_onclose
+# define es_fileno gpgrt_fileno
+# define es_fileno_unlocked gpgrt_fileno_unlocked
+# define es_syshd gpgrt_syshd
+# define es_syshd_unlocked gpgrt_syshd_unlocked
+# define es_stdin _gpgrt_get_std_stream (0)
+# define es_stdout _gpgrt_get_std_stream (1)
+# define es_stderr _gpgrt_get_std_stream (2)
+# define es_flockfile gpgrt_flockfile
+# define es_ftrylockfile gpgrt_ftrylockfile
+# define es_funlockfile gpgrt_funlockfile
+# define es_feof gpgrt_feof
+# define es_feof_unlocked gpgrt_feof_unlocked
+# define es_ferror gpgrt_ferror
+# define es_ferror_unlocked gpgrt_ferror_unlocked
+# define es_clearerr gpgrt_clearerr
+# define es_clearerr_unlocked gpgrt_clearerr_unlocked
+# define es_pending gpgrt_pending
+# define es_pending_unlocked gpgrt_pending_unlocked
+# define es_fflush gpgrt_fflush
+# define es_fseek gpgrt_fseek
+# define es_fseeko gpgrt_fseeko
+# define es_ftell gpgrt_ftell
+# define es_ftello gpgrt_ftello
+# define es_rewind gpgrt_rewind
+# define es_fgetc gpgrt_fgetc
+# define es_fputc gpgrt_fputc
+# define es_getc_unlocked gpgrt_getc_unlocked
+# define es_putc_unlocked gpgrt_putc_unlocked
+# define es_getc gpgrt_getc
+# define es_putc gpgrt_putc
+# define es_ungetc gpgrt_ungetc
+# define es_read gpgrt_read
+# define es_write gpgrt_write
+# define es_write_sanitized gpgrt_write_sanitized
+# define es_write_hexstring gpgrt_write_hexstring
+# define es_fread gpgrt_fread
+# define es_fwrite gpgrt_fwrite
+# define es_fgets gpgrt_fgets
+# define es_fputs gpgrt_fputs
+# define es_fputs_unlocked gpgrt_fputs_unlocked
+# define es_getline gpgrt_getline
+# define es_read_line gpgrt_read_line
+# define es_free gpgrt_free
+# define es_fprintf gpgrt_fprintf
+# define es_fprintf_unlocked gpgrt_fprintf_unlocked
+# define es_printf gpgrt_printf
+# define es_printf_unlocked gpgrt_printf_unlocked
+# define es_vfprintf gpgrt_vfprintf
+# define es_vfprintf_unlocked gpgrt_vfprintf_unlocked
+# define es_setvbuf gpgrt_setvbuf
+# define es_setbuf gpgrt_setbuf
+# define es_set_binary gpgrt_set_binary
+# define es_set_nonblock gpgrt_set_nonblock
+# define es_get_nonblock gpgrt_get_nonblock
+# define es_poll gpgrt_poll
+# define es_tmpfile gpgrt_tmpfile
+# define es_opaque_set gpgrt_opaque_set
+# define es_opaque_get gpgrt_opaque_get
+# define es_fname_set gpgrt_fname_set
+# define es_fname_get gpgrt_fname_get
+# define es_asprintf gpgrt_asprintf
+# define es_vasprintf gpgrt_vasprintf
+# define es_bsprintf gpgrt_bsprintf
+# define es_vbsprintf gpgrt_vbsprintf
+#endif /*GPGRT_ENABLE_ES_MACROS*/
+
+/* Base64 decode functions. */
+
+struct _gpgrt_b64state;
+typedef struct _gpgrt_b64state *gpgrt_b64state_t;
+gpgrt_b64state_t gpgrt_b64dec_start (const char *title);
+gpg_error_t gpgrt_b64dec_proc (gpgrt_b64state_t state,
+ void *buffer, size_t length, size_t *r_nbytes);
+gpg_error_t gpgrt_b64dec_finish (gpgrt_b64state_t state);
#ifdef __cplusplus
}
#endif
+#endif /* GPGRT_H */
#endif /* GPG_ERROR_H */
diff --git a/src/gpg-error.m4 b/src/gpg-error.m4
index 053eceb..60c88d8 100644
--- a/src/gpg-error.m4
+++ b/src/gpg-error.m4
@@ -9,7 +9,7 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
-# Last-changed: 2014-01-24
+# Last-changed: 2014-10-02
dnl AM_PATH_GPG_ERROR([MINIMUM-VERSION,
@@ -17,7 +17,12 @@ dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
dnl
dnl Test for libgpg-error and define GPG_ERROR_CFLAGS, GPG_ERROR_LIBS,
dnl GPG_ERROR_MT_CFLAGS, and GPG_ERROR_MT_LIBS. The _MT_ variants are
-dnl used for programs requireding real multi thread support.
+dnl used for programs requireing real multi thread support.
+dnl
+dnl If a prefix option is not used, the config script is first
+dnl searched in $SYSROOT/bin and then along $PATH. If the used
+dnl config script does not match the host specification the script
+dnl is added to the gpg_config_script_warn variable.
dnl
AC_DEFUN([AM_PATH_GPG_ERROR],
[ AC_REQUIRE([AC_CANONICAL_HOST])
@@ -36,13 +41,26 @@ AC_DEFUN([AM_PATH_GPG_ERROR],
AC_ARG_WITH(gpg-error-prefix,,
[gpg_error_config_prefix="$withval"])
- if test x$gpg_error_config_prefix != x ; then
- if test x${GPG_ERROR_CONFIG+set} != xset ; then
- GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config
+ if test x"${GPG_ERROR_CONFIG}" = x ; then
+ if test x"${gpg_error_config_prefix}" != x ; then
+ GPG_ERROR_CONFIG="${gpg_error_config_prefix}/bin/gpg-error-config"
+ else
+ case "${SYSROOT}" in
+ /*)
+ if test -x "${SYSROOT}/bin/gpg-error-config" ; then
+ GPG_ERROR_CONFIG="${SYSROOT}/bin/gpg-error-config"
+ fi
+ ;;
+ '')
+ ;;
+ *)
+ AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.])
+ ;;
+ esac
fi
fi
- AC_PATH_TOOL(GPG_ERROR_CONFIG, gpg-error-config, no)
+ AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no)
min_gpg_error_version=ifelse([$1], ,0.0,$1)
AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version)
ok=no
@@ -82,9 +100,10 @@ AC_DEFUN([AM_PATH_GPG_ERROR],
*** The config script $GPG_ERROR_CONFIG was
*** built for $gpg_error_config_host and thus may not match the
*** used host $host.
-*** You may want to use the configure option --with-gpg-error-prefix
-*** to specify a matching config script.
+*** You may want to use the configure option --with-libgpg-error-prefix
+*** to specify a matching config script or use \$SYSROOT.
***]])
+ gpg_config_script_warn="$gpg_config_script_warn libgpg-error"
fi
fi
else
diff --git a/src/gpg-error.vers b/src/gpg-error.vers
new file mode 100644
index 0000000..e44128c
--- /dev/null
+++ b/src/gpg-error.vers
@@ -0,0 +1,135 @@
+# libgpg-error.vers - What symbols to export -*- std -*-
+# Copyright (C) 2014 g10 Code GmbH
+#
+# This file is part of libgpg-error.
+#
+# libgpg-error is free software; you can redistribute it 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.
+#
+# libgpg-error is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# NOTE: When adding new functions, please make sure to add them to
+# visibility.h and gpg-error.def.in as well.
+
+
+GPG_ERROR_1.0 {
+ global:
+ gpg_strerror;
+ gpg_strerror_r;
+ gpg_strsource;
+ gpg_err_code_from_errno;
+ gpg_err_code_to_errno;
+ gpg_err_code_from_syserror;
+ gpg_err_set_errno;
+ gpg_error_check_version;
+
+ gpgrt_lock_init;
+ gpgrt_lock_lock;
+ gpgrt_lock_unlock;
+ gpgrt_lock_destroy;
+ gpgrt_yield;
+ gpgrt_lock_trylock;
+
+ gpgrt_set_syscall_clamp;
+ gpgrt_get_syscall_clamp;
+
+ gpgrt_fopen;
+ gpgrt_mopen;
+ gpgrt_fopenmem;
+ gpgrt_fopenmem_init;
+ gpgrt_fdopen;
+ gpgrt_fdopen_nc;
+ gpgrt_sysopen;
+ gpgrt_sysopen_nc;
+ gpgrt_fpopen;
+ gpgrt_fpopen_nc;
+ gpgrt_freopen;
+ gpgrt_fopencookie;
+ gpgrt_fclose;
+ gpgrt_fclose_snatch;
+ gpgrt_onclose;
+ gpgrt_fileno;
+ gpgrt_fileno_unlocked;
+ gpgrt_syshd;
+ gpgrt_syshd_unlocked;
+ _gpgrt_set_std_fd;
+ _gpgrt_get_std_stream;
+ gpgrt_flockfile;
+ gpgrt_ftrylockfile;
+ gpgrt_funlockfile;
+ _gpgrt_pending;
+ _gpgrt_pending_unlocked;
+ gpgrt_feof;
+ gpgrt_feof_unlocked;
+ gpgrt_ferror;
+ gpgrt_ferror_unlocked;
+ gpgrt_clearerr;
+ gpgrt_clearerr_unlocked;
+ gpgrt_fflush;
+ gpgrt_fseek;
+ gpgrt_fseeko;
+ gpgrt_ftell;
+ gpgrt_ftello;
+ gpgrt_rewind;
+ gpgrt_fgetc;
+ _gpgrt_getc_underflow;
+ gpgrt_fputc;
+ _gpgrt_putc_overflow;
+ gpgrt_ungetc;
+ gpgrt_read;
+ gpgrt_write;
+ gpgrt_write_sanitized;
+ gpgrt_write_hexstring;
+ gpgrt_fread;
+ gpgrt_fwrite;
+ gpgrt_fgets;
+ gpgrt_fputs;
+ gpgrt_fputs_unlocked;
+ gpgrt_getline;
+ gpgrt_read_line;
+ gpgrt_free;
+ gpgrt_fprintf;
+ gpgrt_fprintf_unlocked;
+ gpgrt_printf;
+ gpgrt_printf_unlocked;
+ gpgrt_vfprintf;
+ gpgrt_vfprintf_unlocked;
+ gpgrt_setvbuf;
+ gpgrt_setbuf;
+ gpgrt_set_binary;
+ gpgrt_set_nonblock;
+ gpgrt_get_nonblock;
+ gpgrt_poll;
+ gpgrt_tmpfile;
+ gpgrt_opaque_set;
+ gpgrt_opaque_get;
+ gpgrt_fname_set;
+ gpgrt_fname_get;
+
+ gpgrt_asprintf;
+ gpgrt_vasprintf;
+ gpgrt_bsprintf;
+ gpgrt_vbsprintf;
+ gpgrt_snprintf;
+ gpgrt_vsnprintf;
+
+ gpgrt_check_version;
+ gpg_err_init;
+ gpg_err_deinit;
+ gpgrt_set_alloc_func;
+
+ gpgrt_b64dec_start;
+ gpgrt_b64dec_proc;
+ gpgrt_b64dec_finish;
+
+ local:
+ *;
+};
diff --git a/src/gpg-error.w32-manifest.in b/src/gpg-error.w32-manifest.in
new file mode 100644
index 0000000..07f6891
--- /dev/null
+++ b/src/gpg-error.w32-manifest.in
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<description>Error codes and shared functions for GnuPG and others</description>
+<assemblyIdentity
+ type="win32"
+ name="GnuPG.libgpg-error"
+ version="@BUILD_VERSION@"
+ />
+<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/><!-- Vista -->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/><!-- 7 -->
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/><!-- 8 -->
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/><!-- 8.1 -->
+ </application>
+</compatibility>
+</assembly>
diff --git a/src/gpgrt-int.h b/src/gpgrt-int.h
new file mode 100644
index 0000000..701e1d4
--- /dev/null
+++ b/src/gpgrt-int.h
@@ -0,0 +1,376 @@
+/* gpgrt-int.h - Internal definitions
+ * Copyright (C) 2014 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GPGRT_GPGRT_INT_H
+#define _GPGRT_GPGRT_INT_H
+
+#include "gpg-error.h"
+#include "visibility.h"
+
+/* Local error function prototypes. */
+const char *_gpg_strerror (gpg_error_t err);
+int _gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen);
+const char *_gpg_strsource (gpg_error_t err);
+gpg_err_code_t _gpg_err_code_from_errno (int err);
+int _gpg_err_code_to_errno (gpg_err_code_t code);
+gpg_err_code_t _gpg_err_code_from_syserror (void);
+void _gpg_err_set_errno (int err);
+
+gpg_error_t _gpg_err_init (void);
+void _gpg_err_deinit (int mode);
+void _gpgrt_set_alloc_func (void *(*f)(void *a, size_t n));
+
+void *_gpgrt_realloc (void *a, size_t n);
+void *_gpgrt_malloc (size_t n);
+void _gpgrt_free (void *a);
+
+const char *_gpg_error_check_version (const char *req_version);
+
+gpg_err_code_t _gpgrt_lock_init (gpgrt_lock_t *lockhd);
+gpg_err_code_t _gpgrt_lock_lock (gpgrt_lock_t *lockhd);
+gpg_err_code_t _gpgrt_lock_trylock (gpgrt_lock_t *lockhd);
+gpg_err_code_t _gpgrt_lock_unlock (gpgrt_lock_t *lockhd);
+gpg_err_code_t _gpgrt_lock_destroy (gpgrt_lock_t *lockhd);
+gpg_err_code_t _gpgrt_yield (void);
+
+/* Trace support. */
+
+/* The trace macro is used this way:
+ * trace (("enter - foo=%d bar=%s", foo, bar));
+ * Note the double parenthesis, they are important.
+ * To append the current errno to the output, use
+ * trace_errno (EXTPR,("leave - baz=%d", faz));
+ * If EXPR evaluates to true the output of strerror (errno)
+ * is appended to the output. Note that the trace function does
+ * not modify ERRNO. To enable tracing you need to have this
+ * #define ENABLE_TRACING "modulename"
+ * before you include gpgrt-int.h.
+ */
+#ifdef ENABLE_TRACING
+# define trace(X) do { \
+ _gpgrt_internal_trace_begin \
+ (ENABLE_TRACING, __func__, __LINE__, 0); \
+ _gpgrt_internal_trace X; \
+ _gpgrt_internal_trace_end (); \
+ } while (0)
+# define trace_errno(C,X) do { \
+ _gpgrt_internal_trace_begin \
+ (ENABLE_TRACING, __func__, __LINE__, (C)); \
+ _gpgrt_internal_trace X; \
+ _gpgrt_internal_trace_end (); \
+ } while (0)
+# define trace_start(X) do { \
+ _gpgrt_internal_trace_begin \
+ (ENABLE_TRACING, __func__, __LINE__, 0); \
+ _gpgrt_internal_trace_printf X; \
+ } while (0)
+# define trace_append(X) do { \
+ _gpgrt_internal_trace_printf X; \
+ } while (0)
+# define trace_finish(X) do { \
+ _gpgrt_internal_trace_printf X; \
+ _gpgrt_internal_trace_end (); \
+ } while (0)
+#else
+# define trace(X) do { } while (0)
+# define trace_errno(C,X) do { } while (0)
+# define trace_start(X) do { } while (0)
+# define trace_append(X) do { } while (0)
+# define trace_finish(X) do { } while (0)
+#endif /*!ENABLE_TRACING*/
+
+void _gpgrt_internal_trace_begin (const char *mod, const char *file, int line,
+ int with_errno);
+void _gpgrt_internal_trace (const char *format,
+ ...) GPGRT_ATTR_PRINTF(1,2);
+void _gpgrt_internal_trace_printf (const char *format,
+ ...) GPGRT_ATTR_PRINTF(1,2);
+void _gpgrt_internal_trace_end (void);
+
+
+
+/* Local definitions for estream. */
+
+#if HAVE_W32_SYSTEM
+# ifndef O_NONBLOCK
+# define O_NONBLOCK 0x40000000 /* FIXME: Is that safe? */
+# endif
+#endif
+
+/*
+ * A private cookie function to implement an internal IOCTL service.
+ * and ist IOCTL numbers.
+ */
+typedef int (*cookie_ioctl_function_t) (void *cookie, int cmd,
+ void *ptr, size_t *len);
+#define COOKIE_IOCTL_SNATCH_BUFFER 1
+#define COOKIE_IOCTL_NONBLOCK 2
+
+/* An internal variant of gpgrt_cookie_close_function_t with a slot
+ for the ioctl function. */
+struct cookie_io_functions_s
+{
+ struct _gpgrt_cookie_io_functions public;
+ cookie_ioctl_function_t func_ioctl;
+};
+
+typedef enum
+ {
+ BACKEND_MEM,
+ BACKEND_FD,
+ BACKEND_W32,
+ BACKEND_FP,
+ BACKEND_USER,
+ BACKEND_W32_POLLABLE
+ } gpgrt_stream_backend_kind_t;
+
+
+/*
+ * A type to hold notification functions.
+ */
+struct notify_list_s
+{
+ struct notify_list_s *next;
+ void (*fnc) (estream_t, void*); /* The notification function. */
+ void *fnc_value; /* The value to be passed to FNC. */
+};
+typedef struct notify_list_s *notify_list_t;
+
+
+/*
+ * Buffer management layer.
+ */
+
+#define BUFFER_BLOCK_SIZE BUFSIZ
+#define BUFFER_UNREAD_SIZE 16
+
+
+/*
+ * The private object describing a stream.
+ */
+struct _gpgrt_stream_internal
+{
+ unsigned char buffer[BUFFER_BLOCK_SIZE];
+ unsigned char unread_buffer[BUFFER_UNREAD_SIZE];
+
+ gpgrt_lock_t lock; /* Lock. Used by *_stream_lock(). */
+
+ gpgrt_stream_backend_kind_t kind;
+ void *cookie; /* Cookie. */
+ void *opaque; /* Opaque data. */
+ unsigned int modeflags; /* Flags for the backend. */
+ char *printable_fname; /* Malloced filename for es_fname_get. */
+ gpgrt_off_t offset;
+ gpgrt_cookie_read_function_t func_read;
+ gpgrt_cookie_write_function_t func_write;
+ gpgrt_cookie_seek_function_t func_seek;
+ gpgrt_cookie_close_function_t func_close;
+ cookie_ioctl_function_t func_ioctl;
+ int strategy;
+ es_syshd_t syshd; /* A copy of the system handle. */
+ struct
+ {
+ unsigned int err: 1;
+ unsigned int eof: 1;
+ unsigned int hup: 1;
+ } indicators;
+ unsigned int deallocate_buffer: 1;
+ unsigned int is_stdstream:1; /* This is a standard stream. */
+ unsigned int stdstream_fd:2; /* 0, 1 or 2 for a standard stream. */
+ unsigned int printable_fname_inuse: 1; /* es_fname_get has been used. */
+ unsigned int samethread: 1; /* The "samethread" mode keyword. */
+ size_t print_ntotal; /* Bytes written from in print_writer. */
+ notify_list_t onclose; /* On close notify function list. */
+};
+typedef struct _gpgrt_stream_internal *estream_internal_t;
+
+
+/* Local prototypes for estream. */
+int _gpgrt_estream_init (void);
+void _gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void));
+void _gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void));
+
+gpgrt_stream_t _gpgrt_fopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t _gpgrt_mopen (void *_GPGRT__RESTRICT data,
+ size_t data_n, size_t data_len,
+ unsigned int grow,
+ void *(*func_realloc) (void *mem, size_t size),
+ void (*func_free) (void *mem),
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t _gpgrt_fopenmem (size_t memlimit,
+ const char *_GPGRT__RESTRICT mode);
+gpgrt_stream_t _gpgrt_fopenmem_init (size_t memlimit,
+ const char *_GPGRT__RESTRICT mode,
+ const void *data, size_t datalen);
+gpgrt_stream_t _gpgrt_fdopen (int filedes, const char *mode);
+gpgrt_stream_t _gpgrt_fdopen_nc (int filedes, const char *mode);
+gpgrt_stream_t _gpgrt_sysopen (gpgrt_syshd_t *syshd, const char *mode);
+gpgrt_stream_t _gpgrt_sysopen_nc (gpgrt_syshd_t *syshd, const char *mode);
+gpgrt_stream_t _gpgrt_fpopen (FILE *fp, const char *mode);
+gpgrt_stream_t _gpgrt_fpopen_nc (FILE *fp, const char *mode);
+gpgrt_stream_t _gpgrt_freopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+gpgrt_stream_t _gpgrt_fopencookie (void *_GPGRT__RESTRICT cookie,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_cookie_io_functions_t functions);
+int _gpgrt_fclose (gpgrt_stream_t stream);
+int _gpgrt_fclose_snatch (gpgrt_stream_t stream,
+ void **r_buffer, size_t *r_buflen);
+int _gpgrt_onclose (gpgrt_stream_t stream, int mode,
+ void (*fnc) (gpgrt_stream_t, void*), void *fnc_value);
+int _gpgrt_fileno (gpgrt_stream_t stream);
+int _gpgrt_fileno_unlocked (gpgrt_stream_t stream);
+int _gpgrt_syshd (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
+int _gpgrt_syshd_unlocked (gpgrt_stream_t stream, gpgrt_syshd_t *syshd);
+
+void _gpgrt__set_std_fd (int no, int fd);
+gpgrt_stream_t _gpgrt__get_std_stream (int fd);
+
+void _gpgrt_flockfile (gpgrt_stream_t stream);
+int _gpgrt_ftrylockfile (gpgrt_stream_t stream);
+void _gpgrt_funlockfile (gpgrt_stream_t stream);
+
+int _gpgrt_feof (gpgrt_stream_t stream);
+int _gpgrt_feof_unlocked (gpgrt_stream_t stream);
+int _gpgrt_ferror (gpgrt_stream_t stream);
+int _gpgrt_ferror_unlocked (gpgrt_stream_t stream);
+void _gpgrt_clearerr (gpgrt_stream_t stream);
+void _gpgrt_clearerr_unlocked (gpgrt_stream_t stream);
+int _gpgrt__pending (gpgrt_stream_t stream);
+int _gpgrt__pending_unlocked (gpgrt_stream_t stream);
+
+int _gpgrt_fflush (gpgrt_stream_t stream);
+int _gpgrt_fseek (gpgrt_stream_t stream, long int offset, int whence);
+int _gpgrt_fseeko (gpgrt_stream_t stream, gpgrt_off_t offset, int whence);
+long int _gpgrt_ftell (gpgrt_stream_t stream);
+gpgrt_off_t _gpgrt_ftello (gpgrt_stream_t stream);
+void _gpgrt_rewind (gpgrt_stream_t stream);
+
+int _gpgrt_fgetc (gpgrt_stream_t stream);
+int _gpgrt_fputc (int c, gpgrt_stream_t stream);
+
+int _gpgrt__getc_underflow (gpgrt_stream_t stream);
+int _gpgrt__putc_overflow (int c, gpgrt_stream_t stream);
+
+/* Note: Keeps the next two macros in sync
+ with their counterparts in gpg-error.h. */
+#define _gpgrt_getc_unlocked(stream) \
+ (((!(stream)->flags.writing) \
+ && ((stream)->data_offset < (stream)->data_len) \
+ && (! (stream)->unread_data_len)) \
+ ? ((int) (stream)->buffer[((stream)->data_offset)++]) \
+ : _gpgrt__getc_underflow ((stream)))
+
+#define _gpgrt_putc_unlocked(c, stream) \
+ (((stream)->flags.writing \
+ && ((stream)->data_offset < (stream)->buffer_size) \
+ && (c != '\n')) \
+ ? ((int) ((stream)->buffer[((stream)->data_offset)++] = (c))) \
+ : _gpgrt__putc_overflow ((c), (stream)))
+
+int _gpgrt_ungetc (int c, gpgrt_stream_t stream);
+
+int _gpgrt_read (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT buffer, size_t bytes_to_read,
+ size_t *_GPGRT__RESTRICT bytes_read);
+int _gpgrt_write (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t bytes_to_write,
+ size_t *_GPGRT__RESTRICT bytes_written);
+int _gpgrt_write_sanitized (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ const char *delimiters,
+ size_t *_GPGRT__RESTRICT bytes_written);
+int _gpgrt_write_hexstring (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ int reserved,
+ size_t *_GPGRT__RESTRICT bytes_written);
+
+size_t _gpgrt_fread (void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+size_t _gpgrt_fwrite (const void *_GPGRT__RESTRICT ptr,
+ size_t size, size_t memb,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+
+char *_gpgrt_fgets (char *_GPGRT__RESTRICT s, int n,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+int _gpgrt_fputs (const char *_GPGRT__RESTRICT s,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+int _gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
+ gpgrt_stream_t _GPGRT__RESTRICT stream);
+
+gpgrt_ssize_t _gpgrt_getline (char *_GPGRT__RESTRICT *_GPGRT__RESTRICT lineptr,
+ size_t *_GPGRT__RESTRICT n,
+ gpgrt_stream_t stream);
+gpgrt_ssize_t _gpgrt_read_line (gpgrt_stream_t stream,
+ char **addr_of_buffer, size_t *length_of_buffer,
+ size_t *max_length);
+
+int _gpgrt_fprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(2,3);
+int _gpgrt_fprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+ GPGRT_ATTR_PRINTF(2,3);
+
+int _gpgrt_vfprintf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, va_list ap)
+ GPGRT_ATTR_PRINTF(2,0);
+int _gpgrt_vfprintf_unlocked (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, va_list ap)
+ GPGRT_ATTR_PRINTF(2,0);
+
+int _gpgrt_setvbuf (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buf, int mode, size_t size);
+
+void _gpgrt_set_binary (gpgrt_stream_t stream);
+int _gpgrt_set_nonblock (gpgrt_stream_t stream, int onoff);
+int _gpgrt_get_nonblock (gpgrt_stream_t stream);
+
+int _gpgrt_poll (gpgrt_poll_t *fds, unsigned int nfds, int timeout);
+
+gpgrt_stream_t _gpgrt_tmpfile (void);
+
+void _gpgrt_opaque_set (gpgrt_stream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT opaque);
+void *_gpgrt_opaque_get (gpgrt_stream_t stream);
+
+void _gpgrt_fname_set (gpgrt_stream_t stream, const char *fname);
+const char *_gpgrt_fname_get (gpgrt_stream_t stream);
+
+#include "estream-printf.h"
+
+#if _WIN32
+/* Prototypes for w32-estream.c. */
+struct cookie_io_functions_s _gpgrt_functions_w32_pollable;
+int _gpgrt_w32_pollable_create (void *_GPGRT__RESTRICT *_GPGRT__RESTRICT cookie,
+ unsigned int modeflags,
+ struct cookie_io_functions_s next_functions,
+ void *next_cookie);
+int _gpgrt_w32_poll (gpgrt_poll_t *fds, size_t nfds, int timeout);
+#endif
+
+gpgrt_b64state_t _gpgrt_b64dec_start (const char *title);
+gpg_error_t _gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer,
+ size_t length, size_t *r_nbytes);
+gpg_error_t _gpgrt_b64dec_finish (gpgrt_b64state_t state);
+
+
+#endif /*_GPGRT_GPGRT_INT_H*/
diff --git a/src/init.c b/src/init.c
index d4282ac..a1ee505 100644
--- a/src/init.c
+++ b/src/init.c
@@ -7,14 +7,14 @@
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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -26,8 +26,7 @@
#include <string.h>
#include <errno.h>
-#include <gpg-error.h>
-
+#include "gpgrt-int.h"
#include "gettext.h"
#include "init.h"
@@ -49,7 +48,7 @@
#include <windows.h>
-static int tls_index = TLS_OUT_OF_INDEXES; /* Index for the TLS functions. */
+static int tls_index = TLS_OUT_OF_INDEXES; /* Index for the TLS functions. */
static char *get_locale_dir (void);
static void drop_locale_dir (char *locale_dir);
@@ -61,6 +60,11 @@ static void drop_locale_dir (char *locale_dir);
#endif /*!HAVE_W32_SYSTEM*/
+
+/* The realloc function as set by gpgrt_set_alloc_func. */
+static void *(*custom_realloc)(void *a, size_t n);
+
+
static void
real_init (void)
@@ -76,11 +80,12 @@ real_init (void)
drop_locale_dir (locale_dir);
}
#endif
+ _gpgrt_estream_init ();
}
/* Initialize the library. This function should be run early. */
gpg_error_t
-gpg_err_init (void)
+_gpg_err_init (void)
{
#ifdef HAVE_W32_SYSTEM
# ifdef DLL_EXPORT
@@ -123,11 +128,11 @@ gpg_err_init (void)
this function may be called from the DllMain function of a DLL
which statically links to libgpg-error. */
void
-gpg_err_deinit (int mode)
+_gpg_err_deinit (int mode)
{
#if defined (HAVE_W32_SYSTEM) && !defined(DLL_EXPORT)
struct tls_space_s *tls;
-
+
tls = TlsGetValue (tls_index);
if (tls)
{
@@ -146,70 +151,175 @@ gpg_err_deinit (int mode)
}
-
-#ifdef HAVE_W32_SYSTEM
-/* Return a malloced string encoded in UTF-8 from the wide char input
- string STRING. Caller must free this value. Returns NULL on
- failure. Caller may use GetLastError to get the actual error
- number. The result of calling this function with STRING set to
- NULL is not defined. */
-static char *
-wchar_to_utf8 (const wchar_t *string)
+
+/* Register F as allocation function. This function is used for all
+ APIs which return an allocated buffer. F needs to have standard
+ realloc semantics. It should be called as early as possible and
+ not changed later. */
+void
+_gpgrt_set_alloc_func (void *(*f)(void *a, size_t n))
{
- int n;
- char *result;
+ custom_realloc = f;
+}
- /* Note, that CP_UTF8 is not defined in Windows versions earlier
- than NT. */
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL);
- if (n < 0)
- return NULL;
- result = malloc (n+1);
- if (result)
+/* The realloc to be used for data returned by the public API. */
+void *
+_gpgrt_realloc (void *a, size_t n)
+{
+ if (custom_realloc)
+ return custom_realloc (a, n);
+
+ if (!n)
{
- n = WideCharToMultiByte (CP_UTF8, 0, string, -1, result, n, NULL, NULL);
- if (n < 0)
- {
- free (result);
- result = NULL;
- }
+ free (a);
+ return NULL;
}
- return result;
+
+ if (!a)
+ return malloc (n);
+
+ return realloc (a, n);
}
-/* Return a malloced wide char string from an UTF-8 encoded input
- string STRING. Caller must free this value. Returns NULL on
- failure. Caller may use GetLastError to get the actual error
- number. The result of calling this function with STRING set to
- NULL is not defined. */
-static wchar_t *
-utf8_to_wchar (const char *string)
+/* The malloc to be used for data returned by the public API. */
+void *
+_gpgrt_malloc (size_t n)
{
- int n;
- wchar_t *result;
+ if (!n)
+ n++;
+ return _gpgrt_realloc (NULL, n);
+}
+
+
+/* The free to be used for data returned by the public API. */
+void
+_gpgrt_free (void *a)
+{
+ _gpgrt_realloc (a, 0);
+}
+
+
+void
+_gpg_err_set_errno (int err)
+{
+#ifdef HAVE_W32CE_SYSTEM
+ SetLastError (err);
+#else /*!HAVE_W32CE_SYSTEM*/
+ errno = err;
+#endif /*!HAVE_W32CE_SYSTEM*/
+}
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0);
- if (n < 0)
- return NULL;
- result = malloc ((n+1) * sizeof *result);
- if (result)
+
+/* Internal tracing functions. Except for TARCE_FP we use flockfile
+ * and funlockfile to protect their use. */
+static FILE *trace_fp;
+static int trace_save_errno;
+static int trace_with_errno;
+static const char *trace_arg_module;
+static const char *trace_arg_file;
+static int trace_arg_line;
+static int trace_missing_lf;
+static int trace_prefix_done;
+
+void
+_gpgrt_internal_trace_begin (const char *module, const char *file, int line,
+ int with_errno)
+{
+ int save_errno = errno;
+
+ if (!trace_fp)
{
- n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
- if (n < 0)
- {
- free (result);
- result = NULL;
- }
- return NULL;
+ FILE *fp;
+ const char *s = getenv ("GPGRT_TRACE_FILE");
+
+ if (!s || !(fp = fopen (s, "wb")))
+ fp = stderr;
+ trace_fp = fp;
}
- return result;
+
+#ifdef HAVE_FLOCKFILE
+ flockfile (trace_fp);
+#endif
+ trace_save_errno = save_errno;
+ trace_with_errno = with_errno;
+ trace_arg_module = module;
+ trace_arg_file = file;
+ trace_arg_line = line;
+ trace_missing_lf = 0;
+ trace_prefix_done = 0;
+}
+
+static void
+print_internal_trace_prefix (void)
+{
+ if (!trace_prefix_done)
+ {
+ trace_prefix_done = 1;
+ fprintf (trace_fp, "%s:%s:%d: ",
+ trace_arg_module,/* npth_is_protected ()?"":"^",*/
+ trace_arg_file, trace_arg_line);
+ }
+}
+
+static void
+do_internal_trace (const char *format, va_list arg_ptr)
+{
+ print_internal_trace_prefix ();
+ vfprintf (trace_fp, format, arg_ptr);
+ if (trace_with_errno)
+ fprintf (trace_fp, " errno=%s", strerror (trace_save_errno));
+ if (*format && format[strlen(format)-1] != '\n')
+ fputc ('\n', trace_fp);
+}
+
+void
+_gpgrt_internal_trace_printf (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ print_internal_trace_prefix ();
+ va_start (arg_ptr, format) ;
+ vfprintf (trace_fp, format, arg_ptr);
+ va_end (arg_ptr);
+ trace_missing_lf = (*format && format[strlen(format)-1] != '\n');
+}
+
+
+void
+_gpgrt_internal_trace (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format) ;
+ do_internal_trace (format, arg_ptr);
+ va_end (arg_ptr);
+}
+
+
+void
+_gpgrt_internal_trace_end (void)
+{
+ int save_errno = trace_save_errno;
+
+ if (trace_missing_lf)
+ fputc ('\n', trace_fp);
+#ifdef HAVE_FLOCKFILE
+ funlockfile (trace_fp);
+#endif
+ errno = save_errno;
}
+
+#ifdef HAVE_W32_SYSTEM
+/*****************************************
+ ******** Below is only Windows code. ****
+ *****************************************/
+
static char *
get_locale_dir (void)
{
@@ -226,7 +336,7 @@ get_locale_dir (void)
nbytes = WideCharToMultiByte (CP_UTF8, 0, moddir, -1, NULL, 0, NULL, NULL);
if (nbytes < 0)
return NULL;
-
+
result = malloc (nbytes + strlen (SLDIR) + 1);
if (result)
{
@@ -275,8 +385,8 @@ get_locale_dir (void)
strcpy (result, "c:\\gnupg");
strcat (result, SLDIR);
}
- }
-#undef SLDIR
+ }
+#undef SLDIR
return result;
}
@@ -309,7 +419,7 @@ get_tls (void)
tls->gt_use_utf8 = 0;
TlsSetValue (tls_index, tls);
}
-
+
return tls;
}
@@ -357,22 +467,11 @@ _gpg_w32ce_strerror (int err)
if (n < 0)
snprintf (tls->strerror_buffer, sizeof tls->strerror_buffer -1,
"[w32err=%d]", err);
- return tls->strerror_buffer;
+ return tls->strerror_buffer;
}
#endif /*HAVE_W32CE_SYSTEM*/
-void
-gpg_err_set_errno (int err)
-{
-#ifdef HAVE_W32CE_SYSTEM
- SetLastError (err);
-#else /*!HAVE_W32CE_SYSTEM*/
- errno = err;
-#endif /*!HAVE_W32CE_SYSTEM*/
-}
-
-
/* Entry point called by the DLL loader. */
#ifdef DLL_EXPORT
int WINAPI
@@ -380,13 +479,14 @@ DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved)
{
struct tls_space_s *tls;
(void)reserved;
+ (void)hinst;
switch (reason)
{
case DLL_PROCESS_ATTACH:
tls_index = TlsAlloc ();
if (tls_index == TLS_OUT_OF_INDEXES)
- return FALSE;
+ return FALSE;
#ifndef _GPG_ERR_HAVE_CONSTRUCTOR
/* If we have not constructors (e.g. MSC) we call it here. */
_gpg_w32__init_gettext_module ();
@@ -420,17 +520,9 @@ DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved)
default:
break;
}
-
+
return TRUE;
}
#endif /*DLL_EXPORT*/
-#else /*!HAVE_W32_SYSTEM*/
-
-void
-gpg_err_set_errno (int err)
-{
- errno = err;
-}
-
-#endif /*!HAVE_W32_SYSTEM*/
+#endif /*HAVE_W32_SYSTEM*/
diff --git a/src/init.h b/src/init.h
index 0a31fd7..90a716a 100644
--- a/src/init.h
+++ b/src/init.h
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifndef INIT_H
diff --git a/src/lock.h b/src/lock.h
index b60f2c2..b7395db 100644
--- a/src/lock.h
+++ b/src/lock.h
@@ -14,11 +14,13 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifndef LOCK_H
#define LOCK_H
+void _gpgrt_lock_set_lock_clamp (void (*pre)(void), void (*post)(void));
+
#endif /*LOCK_H*/
diff --git a/src/mkheader.c b/src/mkheader.c
index 43e7fd8..5aeb1e7 100644
--- a/src/mkheader.c
+++ b/src/mkheader.c
@@ -23,11 +23,160 @@
#define LINESIZE 1024
static const char *host_os;
-static const char *host_triplet;
+static char *host_triplet;
static char *srcdir;
static const char *hdr_version;
static const char *hdr_version_number;
+/* Values take from the supplied config.h. */
+static int have_stdint_h;
+static int have_w32_system;
+static int have_w64_system;
+static char *replacement_for_off_type;
+static int use_posix_threads;
+
+/* Various state flags. */
+static int stdint_h_included;
+
+
+/* The usual free wrapper. */
+static void
+xfree (void *a)
+{
+ if (a)
+ free (a);
+}
+
+
+static char *
+xstrdup (const char *string)
+{
+ char *p;
+
+ p = malloc (strlen (string)+1);
+ if (!p)
+ {
+ fputs (PGM ": out of core\n", stderr);
+ exit (1);
+ }
+ strcpy (p, string);
+ return p;
+}
+
+
+/* Return a malloced string with TRIPLET. If TRIPLET has an alias
+ return that instead. In general build-aux/config.sub should do the
+ aliasing but some returned triplets are anyway identical and thus we
+ use this function to map it to the canonical form. */
+static char *
+canon_host_triplet (const char *triplet)
+{
+ struct {
+ const char *name;
+ const char *alias;
+ } tbl[] = {
+ {"i486-pc-linux-gnu", "i686-pc-linux-gnu" },
+ {"i586-pc-linux-gnu" },
+ {"i486-pc-gnu", "i686-pc-gnu"},
+ {"i586-pc-gnu"},
+ {"i486-pc-kfreebsd-gnu", "i686-pc-kfreebsd-gnu"},
+ {"i586-pc-kfreebsd-gnu"},
+
+ {"x86_64-pc-linux-gnuhardened1", "x86_64-pc-linux-gnu" },
+
+ {"powerpc-unknown-linux-gnuspe", "powerpc-unknown-linux-gnu" },
+
+ {"arm-unknown-linux-gnueabihf", "arm-unknown-linux-gnueabi" },
+ {"armv7-unknown-linux-gnueabihf" },
+ {"armv5-unknown-linux-musleabi" },
+ {"armv6-unknown-linux-musleabihf" },
+
+ { NULL }
+ };
+ int i;
+ const char *lastalias = NULL;
+
+ for (i=0; tbl[i].name; i++)
+ {
+ if (tbl[i].alias)
+ lastalias = tbl[i].alias;
+ if (!strcmp (tbl[i].name, triplet))
+ {
+ if (!lastalias)
+ break; /* Ooops: first entry has no alias. */
+ return xstrdup (lastalias);
+ }
+ }
+ return xstrdup (triplet);
+}
+
+
+/* Parse the supplied config.h file and extract required info.
+ Returns 0 on success. */
+static int
+parse_config_h (const char *fname)
+{
+ FILE *fp;
+ char line[LINESIZE];
+ int lnr = 0;
+ char *p1;
+
+ fp = fopen (fname, "r");
+ if (!fp)
+ {
+ fprintf (stderr, "%s:%d: can't open file: %s",
+ fname, lnr, strerror (errno));
+ return 1;
+ }
+
+ while (fgets (line, LINESIZE, fp))
+ {
+ size_t n = strlen (line);
+
+ lnr++;
+ if (!n || line[n-1] != '\n')
+ {
+ fprintf (stderr,
+ "%s:%d: trailing linefeed missing, line too long or "
+ "embedded nul character\n", fname, lnr);
+ break;
+ }
+ line[--n] = 0;
+
+ if (strncmp (line, "#define ", 8))
+ continue; /* We are only interested in define lines. */
+ p1 = strtok (line + 8, " \t");
+ if (!*p1)
+ continue; /* oops */
+ if (!strcmp (p1, "HAVE_STDINT_H"))
+ have_stdint_h = 1;
+ else if (!strcmp (p1, "HAVE_W32_SYSTEM"))
+ have_w32_system = 1;
+ else if (!strcmp (p1, "HAVE_W64_SYSTEM"))
+ have_w64_system = 1;
+ else if (!strcmp (p1, "REPLACEMENT_FOR_OFF_T"))
+ {
+ p1 = strtok (NULL, "\"");
+ if (!*p1)
+ continue; /* oops */
+ xfree (replacement_for_off_type);
+ replacement_for_off_type = xstrdup (p1);
+ }
+ else if (!strcmp (p1, "USE_POSIX_THREADS"))
+ use_posix_threads = 1;
+ }
+
+ if (ferror (fp))
+ {
+ fprintf (stderr, "%s:%d: error reading file: %s\n",
+ fname, lnr, strerror (errno));
+ return 1;
+ }
+
+ fclose (fp);
+ return 0;
+}
+
/* Write LINE to stdout. The function is allowed to modify LINE. */
static void
@@ -283,12 +432,57 @@ write_special (const char *fname, int lnr, const char *tag)
putchar ('\"');
fputs (hdr_version, stdout);
putchar ('\"');
- putchar ('\n');
}
else if (!strcmp (tag, "version-number"))
{
fputs (hdr_version_number, stdout);
- putchar ('\n');
+ }
+ else if (!strcmp (tag, "define:gpgrt_off_t"))
+ {
+ if (!replacement_for_off_type)
+ {
+ fprintf (stderr, "%s:%d: replacement for off_t not defined\n",
+ fname, lnr);
+ exit (1);
+ }
+ else
+ {
+ if (!strcmp (replacement_for_off_type, "int64_t")
+ && !stdint_h_included && have_stdint_h)
+ {
+ fputs ("#include <stdint.h>\n\n", stdout);
+ stdint_h_included = 1;
+ }
+ printf ("typedef %s gpgrt_off_t;\n", replacement_for_off_type);
+ }
+ }
+ else if (!strcmp (tag, "define:gpgrt_ssize_t"))
+ {
+ if (have_w64_system)
+ {
+ if (!stdint_h_included && have_stdint_h)
+ {
+ fputs ("# include <stdint.h>\n", stdout);
+ stdint_h_included = 1;
+ }
+ fputs ("typedef int64_t gpgrt_ssize_t;\n", stdout);
+ }
+ else if (have_w32_system)
+ {
+ fputs ("typedef long gpgrt_ssize_t;\n", stdout);
+ }
+ else
+ {
+ fputs ("#include <sys/types.h>\n"
+ "typedef ssize_t gpgrt_ssize_t;\n", stdout);
+ }
+ }
+ else if (!strcmp (tag, "api_ssize_t"))
+ {
+ if (have_w32_system)
+ fputs ("gpgrt_ssize_t", stdout);
+ else
+ fputs ("ssize_t", stdout);
}
else if (!strcmp (tag, "include:err-sources"))
{
@@ -336,24 +530,30 @@ main (int argc, char **argv)
int lnr = 0;
const char *fname, *s;
char *p1, *p2;
+ const char *config_h;
+ const char *host_triplet_raw;
if (argc)
{
argc--; argv++;
}
- if (argc != 5)
+ if (argc != 6)
{
fputs ("usage: " PGM
- " host_os host_triplet template.h version version_number\n",
+ " host_os host_triplet template.h config.h"
+ " version version_number\n",
stderr);
return 1;
}
host_os = argv[0];
- host_triplet = argv[1];
+ host_triplet_raw = argv[1];
fname = argv[2];
- hdr_version = argv[3];
- hdr_version_number = argv[4];
+ config_h = argv[3];
+ hdr_version = argv[4];
+ hdr_version_number = argv[5];
+
+ host_triplet = canon_host_triplet (host_triplet_raw);
srcdir = malloc (strlen (fname) + 2 + 1);
if (!srcdir)
@@ -368,6 +568,9 @@ main (int argc, char **argv)
else
strcpy (srcdir, "./");
+ if (parse_config_h (config_h))
+ return 1;
+
fp = fopen (fname, "r");
if (!fp)
{
@@ -404,10 +607,15 @@ main (int argc, char **argv)
if (!strcmp (p1, "configure_input"))
{
s = strrchr (fname, '/');
- printf ("Do not edit. Generated from %s for %s.",
- s? s+1 : fname, host_triplet);
+ printf ("Do not edit. Generated from %s for:\n%*s",
+ s? s+1 : fname, (int)(p1 - line) + 13, "");
+ if (!strcmp (host_triplet, host_triplet_raw))
+ printf ("%s", host_triplet);
+ else
+ printf ("%s (%s)", host_triplet, host_triplet_raw);
+ if (!use_posix_threads && !have_w32_system && !have_w64_system)
+ fputs (" NO-THREADS", stdout);
fputs (p2, stdout);
- putchar ('\n');
}
else if (!write_special (fname, lnr, p1))
{
@@ -415,8 +623,12 @@ main (int argc, char **argv)
fputs (p1, stdout);
putchar ('@');
fputs (p2, stdout);
- putchar ('\n');
}
+ else if (*p2)
+ {
+ fputs (p2, stdout);
+ }
+ putchar ('\n');
}
if (ferror (fp))
@@ -440,5 +652,6 @@ main (int argc, char **argv)
fclose (fp);
+ xfree (host_triplet);
return 0;
}
diff --git a/src/mkw32errmap.c b/src/mkw32errmap.c
index 68d0f05..508a513 100644
--- a/src/mkw32errmap.c
+++ b/src/mkw32errmap.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifdef RESOLVE_MACROS
diff --git a/src/posix-lock-obj.h b/src/posix-lock-obj.h
index 7714d3c..08e0bac 100644
--- a/src/posix-lock-obj.h
+++ b/src/posix-lock-obj.h
@@ -14,21 +14,28 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifndef POSIX_LOCK_OBJ_H
#define POSIX_LOCK_OBJ_H
-#define LOCK_ABI_VERSION 1
+#define LOCK_ABI_NOT_AVAILABLE (-1)
+#if USE_POSIX_THREADS
+# define LOCK_ABI_VERSION 1
+#else
+# define LOCK_ABI_VERSION LOCK_ABI_NOT_AVAILABLE
+#endif
typedef struct
{
long vers;
+#if USE_POSIX_THREADS
union {
pthread_mutex_t mtx;
long *dummy;
} u;
+#endif
} _gpgrt_lock_t;
diff --git a/src/posix-lock.c b/src/posix-lock.c
index 5b0cab5..d251d2f 100644
--- a/src/posix-lock.c
+++ b/src/posix-lock.c
@@ -15,7 +15,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
Parts of the code, in particular use_pthreads_p, are based on code
from gettext, written by Bruno Haible <bruno@clisp.org>, 2005.
@@ -33,6 +33,7 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <assert.h>
#if USE_POSIX_THREADS
# include <pthread.h>
@@ -43,6 +44,14 @@
#include "posix-lock-obj.h"
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_lock_func)(void);
+static void (*post_lock_func)(void);
+
+
#if USE_POSIX_THREADS
# if USE_POSIX_THREADS_WEAK
/* On ELF systems it is easy to use pthreads using weak
@@ -52,6 +61,7 @@
# pragma weak pthread_cancel
# pragma weak pthread_mutex_init
# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_trylock
# pragma weak pthread_mutex_unlock
# pragma weak pthread_mutex_destroy
# if ! PTHREAD_IN_USE_DETECTION_HARD
@@ -87,7 +97,10 @@ use_pthread_p (void)
/* Thread creation works. */
void *retval;
if (pthread_join (thread, &retval) != 0)
- abort ();
+ {
+ assert (!"pthread_join");
+ abort ();
+ }
result = 1;
}
tested = 1;
@@ -98,6 +111,16 @@ use_pthread_p (void)
#endif /*USE_POSIX_THREADS*/
+/* Helper to set the clamp functions. This is called as a helper from
+ * _gpgrt_set_syscall_clamp to keep the function pointers local. */
+void
+_gpgrt_lock_set_lock_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_lock_func = pre;
+ post_lock_func = post;
+}
+
+
static _gpgrt_lock_t *
get_lock_object (gpgrt_lock_t *lockhd)
@@ -105,16 +128,22 @@ get_lock_object (gpgrt_lock_t *lockhd)
_gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd;
if (lock->vers != LOCK_ABI_VERSION)
- abort ();
+ {
+ assert (!"lock ABI version");
+ abort ();
+ }
if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t))
- abort ();
+ {
+ assert (!"sizeof lock obj");
+ abort ();
+ }
return lock;
}
gpg_err_code_t
-gpgrt_lock_init (gpgrt_lock_t *lockhd)
+_gpgrt_lock_init (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd;
int rc;
@@ -125,7 +154,10 @@ gpgrt_lock_init (gpgrt_lock_t *lockhd)
if (!lock->vers)
{
if (sizeof (gpgrt_lock_t) < sizeof (_gpgrt_lock_t))
- abort ();
+ {
+ assert (!"sizeof lock obj");
+ abort ();
+ }
lock->vers = LOCK_ABI_VERSION;
}
else /* Run the usual check. */
@@ -141,7 +173,7 @@ gpgrt_lock_init (gpgrt_lock_t *lockhd)
else
rc = 0; /* Threads are not used. */
#else /* Unknown thread system. */
- rc = GPG_ERR_NOT_IMPLEMENTED;
+ rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED;
#endif /* Unknown thread system. */
return rc;
@@ -149,7 +181,7 @@ gpgrt_lock_init (gpgrt_lock_t *lockhd)
gpg_err_code_t
-gpgrt_lock_lock (gpgrt_lock_t *lockhd)
+_gpgrt_lock_lock (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
int rc;
@@ -157,14 +189,41 @@ gpgrt_lock_lock (gpgrt_lock_t *lockhd)
#if USE_POSIX_THREADS
if (use_pthread_p())
{
+ if (pre_lock_func)
+ pre_lock_func ();
rc = pthread_mutex_lock (&lock->u.mtx);
if (rc)
rc = gpg_err_code_from_errno (rc);
+ if (post_lock_func)
+ post_lock_func ();
+ }
+ else
+ rc = 0; /* Threads are not used. */
+#else /* Unknown thread system. */
+ rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED;
+#endif /* Unknown thread system. */
+
+ return rc;
+}
+
+
+gpg_err_code_t
+_gpgrt_lock_trylock (gpgrt_lock_t *lockhd)
+{
+ _gpgrt_lock_t *lock = get_lock_object (lockhd);
+ int rc;
+
+#if USE_POSIX_THREADS
+ if (use_pthread_p())
+ {
+ rc = pthread_mutex_trylock (&lock->u.mtx);
+ if (rc)
+ rc = gpg_err_code_from_errno (rc);
}
else
rc = 0; /* Threads are not used. */
#else /* Unknown thread system. */
- rc = GPG_ERR_NOT_IMPLEMENTED;
+ rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED;
#endif /* Unknown thread system. */
return rc;
@@ -172,7 +231,7 @@ gpgrt_lock_lock (gpgrt_lock_t *lockhd)
gpg_err_code_t
-gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
+_gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
int rc;
@@ -187,7 +246,7 @@ gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
else
rc = 0; /* Threads are not used. */
#else /* Unknown thread system. */
- rc = GPG_ERR_NOT_IMPLEMENTED;
+ rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED;
#endif /* Unknown thread system. */
return rc;
@@ -197,7 +256,7 @@ gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
/* Note: Use this function only if no other thread holds or waits for
this lock. */
gpg_err_code_t
-gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
+_gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
int rc;
@@ -218,7 +277,7 @@ gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
else
rc = 0; /* Threads are not used. */
#else /* Unknown thread system. */
- rc = GPG_ERR_NOT_IMPLEMENTED;
+ rc = lock->vers == LOCK_ABI_NOT_AVAILABLE? 0 : GPG_ERR_NOT_IMPLEMENTED;
#endif /* Unknown thread system. */
return rc;
diff --git a/src/posix-thread.c b/src/posix-thread.c
index a739e40..00a43e2 100644
--- a/src/posix-thread.c
+++ b/src/posix-thread.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -43,18 +43,44 @@
#include "thread.h"
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_syscall_func)(void);
+static void (*post_syscall_func)(void);
+
+
+/* Helper to set the clamp functions. This is called as a helper from
+ * _gpgrt_set_syscall_clamp to keep the function pointers local. */
+void
+_gpgrt_thread_set_syscall_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_syscall_func = pre;
+ post_syscall_func = post;
+}
+
+
gpg_err_code_t
-gpgrt_yield (void)
+_gpgrt_yield (void)
{
#if USE_POSIX_THREADS
# ifdef _POSIX_PRIORITY_SCHEDULING
+ if (pre_syscall_func)
+ pre_syscall_func ();
sched_yield ();
+ if (post_syscall_func)
+ post_syscall_func ();
# else
return GPG_ERR_NOT_SUPPORTED;
# endif
#elif USE_SOLARIS_THREADS
+ if (pre_syscall_func)
+ pre_syscall_func ();
thr_yield ();
+ if (post_syscall_func)
+ post_syscall_func ();
#else
return GPG_ERR_NOT_SUPPORTED;
#endif
diff --git a/src/strerror.c b/src/strerror.c
index dc56040..b0efb3d 100644
--- a/src/strerror.c
+++ b/src/strerror.c
@@ -7,12 +7,12 @@
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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpg-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -35,7 +35,7 @@
/* Return a pointer to a string containing a description of the error
code in the error value ERR. This function is not thread-safe. */
const char *
-gpg_strerror (gpg_error_t err)
+_gpg_strerror (gpg_error_t err)
{
gpg_err_code_t code = gpg_err_code (err);
@@ -134,7 +134,7 @@ system_strerror_r (int no, char *buf, size_t buflen)
large enough, ERANGE is returned and BUF contains as much of the
beginning of the error string as fits into the buffer. */
int
-gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen)
+_gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen)
{
gpg_err_code_t code = gpg_err_code (err);
const char *errstr;
diff --git a/src/strsource.c b/src/strsource.c
index 66d783c..6604eb0 100644
--- a/src/strsource.c
+++ b/src/strsource.c
@@ -2,17 +2,17 @@
Copyright (C) 2003 g10 Code GmbH
This file is part of libgpg-error.
-
+
libgpg-error is free software; you can redistribute it 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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpg-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -30,7 +30,7 @@
/* Return a pointer to a string containing a description of the error
source in the error value ERR. */
const char *
-gpg_strsource (gpg_error_t err)
+_gpg_strsource (gpg_error_t err)
{
gpg_err_source_t source = gpg_err_source (err);
return dgettext (PACKAGE, msgstr + msgidx[msgidxof (source)]);
diff --git a/src/syscfg/lock-obj-pub.aarch64-apple-darwin.h b/src/syscfg/lock-obj-pub.aarch64-apple-darwin.h
new file mode 100644
index 0000000..3eeadfe
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.aarch64-apple-darwin.h
@@ -0,0 +1,28 @@
+## lock-obj-pub.aarch64-apple-darwin.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[64];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{167,171,170,50,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h
new file mode 100644
index 0000000..adf10fc
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.aarch64-unknown-linux-gnu.h
@@ -0,0 +1,26 @@
+## lock-obj-pub.aarch64-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[48];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h
new file mode 100644
index 0000000..80ddf01
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.alpha-unknown-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.alpha-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.arm-apple-darwin.h b/src/syscfg/lock-obj-pub.arm-apple-darwin.h
new file mode 100644
index 0000000..4e9f630
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.arm-apple-darwin.h
@@ -0,0 +1,26 @@
+## lock-obj-pub.arm-apple-darwin.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[44];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{167,171,170,50,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h b/src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h
new file mode 100644
index 0000000..7a92276
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.arm-unknown-linux-gnueabi.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.arm-unknown-linux-gnueabi.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h
new file mode 100644
index 0000000..b57bb76
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.hppa-unknown-linux-gnu.h
@@ -0,0 +1,27 @@
+## lock-obj-pub.hppa-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[48];
+ int _x16_align __attribute__ ((aligned (16)));
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.i386-apple-darwin.h b/src/syscfg/lock-obj-pub.i386-apple-darwin.h
new file mode 100644
index 0000000..a5963c4
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.i386-apple-darwin.h
@@ -0,0 +1,26 @@
+## lock-obj-pub.i386-apple-darwin.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[44];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{167,171,170,50,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.i686-pc-gnu.h b/src/syscfg/lock-obj-pub.i686-pc-gnu.h
new file mode 100644
index 0000000..0522462
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.i686-pc-gnu.h
@@ -0,0 +1,24 @@
+## lock-obj-pub.i686-pc-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[32];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h b/src/syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h
new file mode 100644
index 0000000..4cf12fc
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.i686-pc-kfreebsd-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.i686-pc-kfreebsd-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.i686-pc-linux-gnu.h b/src/syscfg/lock-obj-pub.i686-pc-linux-gnu.h
new file mode 100644
index 0000000..b97273b
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.i686-pc-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.i686-pc-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h
new file mode 100644
index 0000000..3788797
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.m68k-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.m68k-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.mingw32.h b/src/syscfg/lock-obj-pub.mingw32.h
index 2f3f911..f35aee1 100644
--- a/src/syscfg/lock-obj-pub.mingw32.h
+++ b/src/syscfg/lock-obj-pub.mingw32.h
@@ -20,25 +20,25 @@
#pragma pack(push, 8)
typedef struct
{
- volatile char priv[56];
+ volatile unsigned char priv[56];
} gpgrt_lock_t;
#pragma pack(pop)
-#define GPGRT_LOCK_INITIALIZER {1,0,0,0,0,0,0,0,255,255,255,255, \
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0,0,0,0,0}
+#define GPGRT_LOCK_INITIALIZER {{1,0,0,0,0,0,0,0,255,255,255,255, \
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0,0,0,0,0}}
#else
#pragma pack(push, 8)
typedef struct
{
- volatile char priv[36];
+ volatile unsigned char priv[36];
} gpgrt_lock_t;
#pragma pack(pop)
-#define GPGRT_LOCK_INITIALIZER {1,0,0,0,0,0,0,0,255,255,255,255, \
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
- 0,0,0,0,0,0,0,0}
+#define GPGRT_LOCK_INITIALIZER {{1,0,0,0,0,0,0,0,255,255,255,255, \
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}
#endif
diff --git a/src/syscfg/lock-obj-pub.mips-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.mips-unknown-linux-gnu.h
new file mode 100644
index 0000000..b31206e
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.mips-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.mips-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h b/src/syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h
new file mode 100644
index 0000000..8a81e3f
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.mips64el-unknown-linux-gnuabi64.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.mips64el-unknown-linux-gnuabi64.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h
new file mode 100644
index 0000000..3a24571
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.mipsel-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.mipsel-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h
new file mode 100644
index 0000000..dbd46da
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.nios2-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h
new file mode 100644
index 0000000..60eadab
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.or1k-unknown-linux-gnu.h
@@ -0,0 +1,24 @@
+## lock-obj-pub.or1k-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[32];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h
new file mode 100644
index 0000000..6601bc9
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.powerpc-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h b/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h
new file mode 100644
index 0000000..c53413b
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.powerpc-unknown-linux-gnuspe.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.powerpc-unknown-linux-gnuspe.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h
new file mode 100644
index 0000000..635e6eb
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.powerpc64-unknown-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.powerpc64-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h
new file mode 100644
index 0000000..79073d4
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.powerpc64le-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h b/src/syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h
new file mode 100644
index 0000000..70f6e33
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.s390x-ibm-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.s390x-ibm-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h
new file mode 100644
index 0000000..a2ff11f
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.sh3-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.sh3-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h
new file mode 100644
index 0000000..eb62ba3
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.sh4-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.sh4-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h
new file mode 100644
index 0000000..2748b26
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.sparc-unknown-linux-gnu.h
@@ -0,0 +1,23 @@
+## lock-obj-pub.sparc-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[24];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h
new file mode 100644
index 0000000..ee309a9
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.sparc64-unknown-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.sparc64-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h
new file mode 100644
index 0000000..b99ea32
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.tilegx-unknown-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.tilegx-unknown-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.x86_64-apple-darwin.h b/src/syscfg/lock-obj-pub.x86_64-apple-darwin.h
new file mode 100644
index 0000000..eaf8689
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.x86_64-apple-darwin.h
@@ -0,0 +1,28 @@
+## lock-obj-pub.x86_64-apple-darwin.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[64];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{167,171,170,50,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0, \
+0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h b/src/syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h
new file mode 100644
index 0000000..7fb596c
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.x86_64-pc-kfreebsd-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.x86_64-pc-kfreebsd-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h b/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h
new file mode 100644
index 0000000..0dd6431
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnu.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.x86_64-pc-linux-gnu.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h b/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h
new file mode 100644
index 0000000..e85bd30
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.x86_64-pc-linux-gnux32.h
@@ -0,0 +1,24 @@
+## lock-obj-pub.x86_64-pc-linux-gnux32.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[32];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/syscfg/lock-obj-pub.x86_64-pc-linux-musl.h b/src/syscfg/lock-obj-pub.x86_64-pc-linux-musl.h
new file mode 100644
index 0000000..1b059f4
--- /dev/null
+++ b/src/syscfg/lock-obj-pub.x86_64-pc-linux-musl.h
@@ -0,0 +1,25 @@
+## lock-obj-pub.x86_64-pc-linux-musl.h
+## File created by gen-posix-lock-obj - DO NOT EDIT
+## To be included by mkheader into gpg-error.h
+
+typedef struct
+{
+ long _vers;
+ union {
+ volatile char _priv[40];
+ long _x_align;
+ long *_xp_align;
+ } u;
+} gpgrt_lock_t;
+
+#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0}}}
+##
+## Local Variables:
+## mode: c
+## buffer-read-only: t
+## End:
+##
diff --git a/src/thread.h b/src/thread.h
index 0b2cf04..f064cce 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -14,11 +14,13 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifndef THREAD_H
#define THREAD_H
+void _gpgrt_thread_set_syscall_clamp (void (*pre)(void), void (*post)(void));
+
#endif /*THREAD_H*/
diff --git a/src/version.c b/src/version.c
index 5b40537..eaeedf8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -14,7 +14,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -39,7 +39,7 @@ cright_blurb (void)
static const char blurb[] =
"\n\n"
"This is Libgpg-error " PACKAGE_VERSION " - An error code library\n"
- "Copyright 2003, 2004, 2010, 2013, 2014 g10 Code GmbH\n"
+ "Copyright 2003-2004, 2010, 2013-2017 g10 Code GmbH\n"
"\n"
"(" BUILD_REVISION " " BUILD_TIMESTAMP ")\n"
"\n\n";
@@ -113,7 +113,7 @@ compare_versions (const char *my_version, const char *req_version)
* and the version string is simply returned.
*/
const char *
-gpg_error_check_version (const char *req_version)
+_gpg_error_check_version (const char *req_version)
{
if (req_version && req_version[0] == 1 && req_version[1] == 1)
return cright_blurb ();
diff --git a/src/versioninfo.rc.in b/src/versioninfo.rc.in
index bcf5893..0986a42 100644
--- a/src/versioninfo.rc.in
+++ b/src/versioninfo.rc.in
@@ -39,7 +39,7 @@ BEGIN
VALUE "FileDescription", "libgpg-error - Common error codes\0"
VALUE "FileVersion", "@LIBGPG_ERROR_LT_CURRENT@.@LIBGPG_ERROR_LT_AGE@.@LIBGPG_ERROR_LT_REVISION@.@BUILD_REVISION@\0"
VALUE "InternalName", "libgpg-error\0"
- VALUE "LegalCopyright", "Copyright © 2013 g10 Code GmbH\0"
+ VALUE "LegalCopyright", "Copyright © 2017 g10 Code GmbH\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "libgpg-error.dll\0"
VALUE "PrivateBuild", "\0"
@@ -50,3 +50,4 @@ BEGIN
END
END
+1 RT_MANIFEST "gpg-error.w32-manifest"
diff --git a/src/visibility.c b/src/visibility.c
new file mode 100644
index 0000000..b637e7a
--- /dev/null
+++ b/src/visibility.c
@@ -0,0 +1,732 @@
+/* visibility.c - Wrapper for all public functions.
+ * Copyright (C) 2014 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <stdarg.h>
+
+#define _GPGRT_INCL_BY_VISIBILITY_C 1
+#include "gpgrt-int.h"
+
+const char *
+gpg_strerror (gpg_error_t err)
+{
+ return _gpg_strerror (err);
+}
+
+int
+gpg_strerror_r (gpg_error_t err, char *buf, size_t buflen)
+{
+ return _gpg_strerror_r (err, buf, buflen);
+}
+
+const char *
+gpg_strsource (gpg_error_t err)
+{
+ return _gpg_strsource (err);
+}
+
+gpg_err_code_t
+gpg_err_code_from_errno (int err)
+{
+ return _gpg_err_code_from_errno (err);
+}
+
+int
+gpg_err_code_to_errno (gpg_err_code_t code)
+{
+ return _gpg_err_code_to_errno (code);
+}
+
+gpg_err_code_t
+gpg_err_code_from_syserror (void)
+{
+ return _gpg_err_code_from_syserror ();
+}
+
+void
+gpg_err_set_errno (int err)
+{
+ _gpg_err_set_errno (err);
+}
+
+
+gpg_error_t
+gpg_err_init (void)
+{
+ return _gpg_err_init ();
+}
+
+void
+gpg_err_deinit (int mode)
+{
+ _gpg_err_deinit (mode);
+}
+
+const char *
+gpg_error_check_version (const char *req_version)
+{
+ return _gpg_error_check_version (req_version);
+}
+
+const char *
+gpgrt_check_version (const char *req_version)
+{
+ return _gpg_error_check_version (req_version);
+}
+
+void
+gpgrt_set_syscall_clamp (void (*pre)(void), void (*post)(void))
+{
+ _gpgrt_set_syscall_clamp (pre, post);
+}
+
+void
+gpgrt_get_syscall_clamp (void (**r_pre)(void), void (**r_post)(void))
+{
+ _gpgrt_get_syscall_clamp (r_pre, r_post);
+}
+
+void
+gpgrt_set_alloc_func (void *(*f)(void *a, size_t n))
+{
+ _gpgrt_set_alloc_func (f);
+}
+
+
+gpg_err_code_t
+gpgrt_lock_init (gpgrt_lock_t *lockhd)
+{
+ return _gpgrt_lock_init (lockhd);
+}
+
+gpg_err_code_t
+gpgrt_lock_lock (gpgrt_lock_t *lockhd)
+{
+ return _gpgrt_lock_lock (lockhd);
+}
+
+gpg_err_code_t
+gpgrt_lock_trylock (gpgrt_lock_t *lockhd)
+{
+ return _gpgrt_lock_trylock (lockhd);
+}
+
+gpg_err_code_t
+gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
+{
+ return _gpgrt_lock_unlock (lockhd);
+}
+
+gpg_err_code_t
+gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
+{
+ return _gpgrt_lock_destroy (lockhd);
+}
+
+gpg_err_code_t
+gpgrt_yield (void)
+{
+ return _gpgrt_yield ();
+}
+
+
+
+estream_t
+gpgrt_fopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode)
+{
+ return _gpgrt_fopen (path, mode);
+}
+
+estream_t
+gpgrt_mopen (void *_GPGRT__RESTRICT data, size_t data_n, size_t data_len,
+ unsigned int grow,
+ void *(*func_realloc) (void *mem, size_t size),
+ void (*func_free) (void *mem),
+ const char *_GPGRT__RESTRICT mode)
+{
+ return _gpgrt_mopen (data, data_n, data_len, grow, func_realloc, func_free,
+ mode);
+}
+
+estream_t
+gpgrt_fopenmem (size_t memlimit, const char *_GPGRT__RESTRICT mode)
+{
+ return _gpgrt_fopenmem (memlimit, mode);
+}
+
+estream_t
+gpgrt_fopenmem_init (size_t memlimit, const char *_GPGRT__RESTRICT mode,
+ const void *data, size_t datalen)
+{
+ return _gpgrt_fopenmem_init (memlimit, mode, data, datalen);
+}
+
+estream_t
+gpgrt_fdopen (int filedes, const char *mode)
+{
+ return _gpgrt_fdopen (filedes, mode);
+}
+
+estream_t
+gpgrt_fdopen_nc (int filedes, const char *mode)
+{
+ return _gpgrt_fdopen_nc (filedes, mode);
+}
+
+estream_t
+gpgrt_sysopen (es_syshd_t *syshd, const char *mode)
+{
+ return _gpgrt_sysopen (syshd, mode);
+}
+
+estream_t
+gpgrt_sysopen_nc (es_syshd_t *syshd, const char *mode)
+{
+ return _gpgrt_sysopen_nc (syshd, mode);
+}
+
+estream_t
+gpgrt_fpopen (FILE *fp, const char *mode)
+{
+ return _gpgrt_fpopen (fp, mode);
+}
+
+estream_t
+gpgrt_fpopen_nc (FILE *fp, const char *mode)
+{
+ return _gpgrt_fpopen_nc (fp, mode);
+}
+
+estream_t
+gpgrt_freopen (const char *_GPGRT__RESTRICT path,
+ const char *_GPGRT__RESTRICT mode,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_freopen (path, mode, stream);
+}
+
+estream_t
+gpgrt_fopencookie (void *_GPGRT__RESTRICT cookie,
+ const char *_GPGRT__RESTRICT mode,
+ gpgrt_cookie_io_functions_t functions)
+{
+ return _gpgrt_fopencookie (cookie, mode, functions);
+}
+
+int
+gpgrt_fclose (estream_t stream)
+{
+ return _gpgrt_fclose (stream);
+}
+
+int
+gpgrt_fclose_snatch (estream_t stream, void **r_buffer, size_t *r_buflen)
+{
+ return _gpgrt_fclose_snatch (stream, r_buffer, r_buflen);
+}
+
+int
+gpgrt_onclose (estream_t stream, int mode,
+ void (*fnc) (estream_t, void*), void *fnc_value)
+{
+ return _gpgrt_onclose (stream, mode, fnc, fnc_value);
+}
+
+int
+gpgrt_fileno (estream_t stream)
+{
+ return _gpgrt_fileno (stream);
+}
+
+int
+gpgrt_fileno_unlocked (estream_t stream)
+{
+ return _gpgrt_fileno_unlocked (stream);
+}
+
+int
+gpgrt_syshd (estream_t stream, es_syshd_t *syshd)
+{
+ return _gpgrt_syshd (stream, syshd);
+}
+
+int
+gpgrt_syshd_unlocked (estream_t stream, es_syshd_t *syshd)
+{
+ return _gpgrt_syshd_unlocked (stream, syshd);
+}
+
+void
+_gpgrt_set_std_fd (int no, int fd)
+{
+ _gpgrt__set_std_fd (no, fd); /* (double dash in name) */
+}
+
+estream_t
+_gpgrt_get_std_stream (int fd)
+{
+ return _gpgrt__get_std_stream (fd); /* (double dash in name) */
+}
+
+void
+gpgrt_flockfile (estream_t stream)
+{
+ _gpgrt_flockfile (stream);
+}
+
+int
+gpgrt_ftrylockfile (estream_t stream)
+{
+ return _gpgrt_ftrylockfile (stream);
+}
+
+void
+gpgrt_funlockfile (estream_t stream)
+{
+ _gpgrt_funlockfile (stream);
+}
+
+int
+_gpgrt_pending (estream_t stream)
+{
+ return _gpgrt__pending (stream);
+}
+
+int
+_gpgrt_pending_unlocked (estream_t stream)
+{
+ return _gpgrt__pending_unlocked (stream);
+}
+
+int
+gpgrt_feof (estream_t stream)
+{
+ return _gpgrt_feof (stream);
+}
+
+int
+gpgrt_feof_unlocked (estream_t stream)
+{
+ return _gpgrt_feof_unlocked (stream);
+}
+
+int
+gpgrt_ferror (estream_t stream)
+{
+ return _gpgrt_ferror (stream);
+}
+
+int
+gpgrt_ferror_unlocked (estream_t stream)
+{
+ return _gpgrt_ferror_unlocked (stream);
+}
+
+void
+gpgrt_clearerr (estream_t stream)
+{
+ _gpgrt_clearerr (stream);
+}
+
+void
+gpgrt_clearerr_unlocked (estream_t stream)
+{
+ _gpgrt_clearerr_unlocked (stream);
+}
+
+int
+gpgrt_fflush (estream_t stream)
+{
+ return _gpgrt_fflush (stream);
+}
+
+int
+gpgrt_fseek (estream_t stream, long int offset, int whence)
+{
+ return _gpgrt_fseek (stream, offset, whence);
+}
+
+int
+gpgrt_fseeko (estream_t stream, gpgrt_off_t offset, int whence)
+{
+ return _gpgrt_fseeko (stream, offset, whence);
+}
+
+long int
+gpgrt_ftell (estream_t stream)
+{
+ return _gpgrt_ftell (stream);
+}
+
+gpgrt_off_t
+gpgrt_ftello (estream_t stream)
+{
+ return _gpgrt_ftello (stream);
+}
+
+void
+gpgrt_rewind (estream_t stream)
+{
+ _gpgrt_rewind (stream);
+}
+
+int
+gpgrt_fgetc (estream_t stream)
+{
+ return _gpgrt_fgetc (stream);
+}
+
+int
+_gpgrt_getc_underflow (estream_t stream)
+{
+ return _gpgrt__getc_underflow (stream);
+}
+
+int
+gpgrt_fputc (int c, estream_t stream)
+{
+ return _gpgrt_fputc (c, stream);
+}
+
+int
+_gpgrt_putc_overflow (int c, estream_t stream)
+{
+ return _gpgrt__putc_overflow (c, stream);
+}
+
+int
+gpgrt_ungetc (int c, estream_t stream)
+{
+ return _gpgrt_ungetc (c, stream);
+}
+
+int
+gpgrt_read (estream_t _GPGRT__RESTRICT stream,
+ void *_GPGRT__RESTRICT buffer, size_t bytes_to_read,
+ size_t *_GPGRT__RESTRICT bytes_read)
+{
+ return _gpgrt_read (stream, buffer, bytes_to_read, bytes_read);
+}
+
+int
+gpgrt_write (estream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t bytes_to_write,
+ size_t *_GPGRT__RESTRICT bytes_written)
+{
+ return _gpgrt_write (stream, buffer, bytes_to_write, bytes_written);
+}
+
+int
+gpgrt_write_sanitized (estream_t _GPGRT__RESTRICT stream,
+ const void * _GPGRT__RESTRICT buffer, size_t length,
+ const char * delimiters,
+ size_t * _GPGRT__RESTRICT bytes_written)
+{
+ return _gpgrt_write_sanitized (stream, buffer, length, delimiters,
+ bytes_written);
+}
+
+int
+gpgrt_write_hexstring (estream_t _GPGRT__RESTRICT stream,
+ const void *_GPGRT__RESTRICT buffer, size_t length,
+ int reserved, size_t *_GPGRT__RESTRICT bytes_written )
+{
+ return _gpgrt_write_hexstring (stream, buffer, length, reserved,
+ bytes_written);
+}
+
+size_t
+gpgrt_fread (void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_fread (ptr, size, nitems, stream);
+}
+
+size_t
+gpgrt_fwrite (const void *_GPGRT__RESTRICT ptr, size_t size, size_t nitems,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_fwrite (ptr, size, nitems, stream);
+}
+
+char *
+gpgrt_fgets (char *_GPGRT__RESTRICT buffer, int length,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_fgets (buffer, length, stream);
+}
+
+int
+gpgrt_fputs (const char *_GPGRT__RESTRICT s, estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_fputs (s, stream);
+}
+
+int
+gpgrt_fputs_unlocked (const char *_GPGRT__RESTRICT s,
+ estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_fputs_unlocked (s, stream);
+}
+
+gpgrt_ssize_t
+gpgrt_getline (char *_GPGRT__RESTRICT *_GPGRT__RESTRICT lineptr,
+ size_t *_GPGRT__RESTRICT n, estream_t _GPGRT__RESTRICT stream)
+{
+ return _gpgrt_getline (lineptr, n, stream);
+}
+
+gpgrt_ssize_t
+gpgrt_read_line (estream_t stream,
+ char **addr_of_buffer, size_t *length_of_buffer,
+ size_t *max_length)
+{
+ return _gpgrt_read_line (stream, addr_of_buffer, length_of_buffer,
+ max_length);
+}
+
+void
+gpgrt_free (void *a)
+{
+ if (a)
+ _gpgrt_free (a);
+}
+
+int
+gpgrt_vfprintf (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format,
+ va_list ap)
+{
+ return _gpgrt_vfprintf (stream, format, ap);
+}
+
+int
+gpgrt_vfprintf_unlocked (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format,
+ va_list ap)
+{
+ return _gpgrt_vfprintf_unlocked (stream, format, ap);
+}
+
+int
+gpgrt_printf (const char *_GPGRT__RESTRICT format, ...)
+{
+ va_list ap;
+ int rc;
+
+ va_start (ap, format);
+ rc = _gpgrt_vfprintf (es_stdout, format, ap);
+ va_end (ap);
+
+ return rc;
+}
+
+int
+gpgrt_printf_unlocked (const char *_GPGRT__RESTRICT format, ...)
+{
+ va_list ap;
+ int rc;
+
+ va_start (ap, format);
+ rc = _gpgrt_vfprintf_unlocked (es_stdout, format, ap);
+ va_end (ap);
+
+ return rc;
+}
+
+int
+gpgrt_fprintf (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+{
+ va_list ap;
+ int rc;
+
+ va_start (ap, format);
+ rc = _gpgrt_vfprintf (stream, format, ap);
+ va_end (ap);
+
+ return rc;
+}
+
+int
+gpgrt_fprintf_unlocked (estream_t _GPGRT__RESTRICT stream,
+ const char *_GPGRT__RESTRICT format, ...)
+{
+ va_list ap;
+ int rc;
+
+ va_start (ap, format);
+ rc = _gpgrt_vfprintf_unlocked (stream, format, ap);
+ va_end (ap);
+
+ return rc;
+}
+
+int
+gpgrt_setvbuf (estream_t _GPGRT__RESTRICT stream,
+ char *_GPGRT__RESTRICT buf, int type, size_t size)
+{
+ return _gpgrt_setvbuf (stream, buf, type, size);
+}
+
+void
+gpgrt_setbuf (estream_t _GPGRT__RESTRICT stream, char *_GPGRT__RESTRICT buf)
+{
+ _gpgrt_setvbuf (stream, buf, buf? _IOFBF : _IONBF, BUFSIZ);
+}
+
+void
+gpgrt_set_binary (estream_t stream)
+{
+ _gpgrt_set_binary (stream);
+}
+
+int
+gpgrt_set_nonblock (estream_t stream, int onoff)
+{
+ return _gpgrt_set_nonblock (stream, onoff);
+}
+
+int
+gpgrt_get_nonblock (estream_t stream)
+{
+ return _gpgrt_get_nonblock (stream);
+}
+
+int
+gpgrt_poll (gpgrt_poll_t *fds, unsigned int nfds, int timeout)
+{
+ return _gpgrt_poll (fds, nfds, timeout);
+}
+
+estream_t
+gpgrt_tmpfile (void)
+{
+ return _gpgrt_tmpfile ();
+}
+
+void
+gpgrt_opaque_set (estream_t stream, void *opaque)
+{
+ _gpgrt_opaque_set (stream, opaque);
+}
+
+void *
+gpgrt_opaque_get (estream_t stream)
+{
+ return _gpgrt_opaque_get (stream);
+}
+
+void
+gpgrt_fname_set (estream_t stream, const char *fname)
+{
+ _gpgrt_fname_set (stream, fname);
+}
+
+const char *
+gpgrt_fname_get (estream_t stream)
+{
+ return _gpgrt_fname_get (stream);
+}
+
+int
+gpgrt_asprintf (char **r_buf, const char *_GPGRT__RESTRICT format, ...)
+{
+ va_list ap;
+ int rc;
+
+ va_start (ap, format);
+ rc = _gpgrt_estream_vasprintf (r_buf, format, ap);
+ va_end (ap);
+
+ return rc;
+}
+
+int
+gpgrt_vasprintf (char **r_buf, const char *_GPGRT__RESTRICT format, va_list ap)
+{
+ return _gpgrt_estream_vasprintf (r_buf, format, ap);
+}
+
+char *
+gpgrt_bsprintf (const char *_GPGRT__RESTRICT format, ...)
+{
+ int rc;
+ va_list ap;
+ char *buf;
+
+ va_start (ap, format);
+ rc = _gpgrt_estream_vasprintf (&buf, format, ap);
+ va_end (ap);
+ if (rc < 0)
+ return NULL;
+ return buf;
+}
+
+char *
+gpgrt_vbsprintf (const char *_GPGRT__RESTRICT format, va_list ap)
+{
+ int rc;
+ char *buf;
+
+ rc = _gpgrt_estream_vasprintf (&buf, format, ap);
+ if (rc < 0)
+ return NULL;
+ return buf;
+}
+
+int
+gpgrt_snprintf (char *buf, size_t bufsize, const char *format, ...)
+{
+ int rc;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, format);
+ rc = _gpgrt_estream_vsnprintf (buf, bufsize, format, arg_ptr);
+ va_end (arg_ptr);
+
+ return rc;
+}
+
+int
+gpgrt_vsnprintf (char *buf, size_t bufsize,
+ const char *format, va_list arg_ptr)
+{
+ return _gpgrt_estream_vsnprintf (buf, bufsize, format, arg_ptr);
+}
+
+gpgrt_b64state_t
+gpgrt_b64dec_start (const char *title)
+{
+ return _gpgrt_b64dec_start (title);
+}
+
+gpg_error_t
+gpgrt_b64dec_proc (gpgrt_b64state_t state, void *buffer,
+ size_t length, size_t *r_nbytes)
+{
+ return _gpgrt_b64dec_proc (state, buffer, length, r_nbytes);
+}
+
+gpg_error_t
+gpgrt_b64dec_finish (gpgrt_b64state_t state)
+{
+ return _gpgrt_b64dec_finish (state);
+}
diff --git a/src/visibility.h b/src/visibility.h
new file mode 100644
index 0000000..da8e228
--- /dev/null
+++ b/src/visibility.h
@@ -0,0 +1,268 @@
+/* visibility.h - Set visibility attribute
+ * Copyright (C) 2014 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GPGRT_VISIBILITY_H
+#define _GPGRT_VISIBILITY_H
+
+/* Include the main header here so that public symbols are mapped to
+ the internal underscored ones. */
+#ifdef _GPGRT_INCL_BY_VISIBILITY_C
+# include "gpgrt-int.h"
+#endif
+
+
+/* Our use of the ELF visibility feature works by passing
+ -fvisibiliy=hidden on the command line and by explicitly marking
+ all exported functions as visible.
+
+ NOTE: When adding new functions, please make sure to add them to
+ gpg-error.vers and gpg-error.def.in as well. */
+
+#ifdef _GPGRT_INCL_BY_VISIBILITY_C
+
+# ifdef GPGRT_USE_VISIBILITY
+# define MARK_VISIBLE(name) \
+ extern __typeof__ (name) name __attribute__ ((visibility("default")));
+# else
+# define MARK_VISIBLE(name) /* */
+# endif
+
+MARK_VISIBLE (gpg_strerror)
+MARK_VISIBLE (gpg_strerror_r)
+MARK_VISIBLE (gpg_strsource)
+MARK_VISIBLE (gpg_err_code_from_errno)
+MARK_VISIBLE (gpg_err_code_to_errno)
+MARK_VISIBLE (gpg_err_code_from_syserror)
+MARK_VISIBLE (gpg_err_set_errno)
+
+MARK_VISIBLE (gpg_err_init)
+MARK_VISIBLE (gpg_err_deinit)
+MARK_VISIBLE (gpg_error_check_version)
+MARK_VISIBLE (gpgrt_check_version)
+
+MARK_VISIBLE (gpgrt_lock_init)
+MARK_VISIBLE (gpgrt_lock_lock)
+MARK_VISIBLE (gpgrt_lock_unlock)
+MARK_VISIBLE (gpgrt_lock_destroy)
+MARK_VISIBLE (gpgrt_yield)
+MARK_VISIBLE (gpgrt_lock_trylock)
+
+MARK_VISIBLE (gpgrt_fopen)
+MARK_VISIBLE (gpgrt_mopen)
+MARK_VISIBLE (gpgrt_fopenmem)
+MARK_VISIBLE (gpgrt_fopenmem_init)
+MARK_VISIBLE (gpgrt_fdopen)
+MARK_VISIBLE (gpgrt_fdopen_nc)
+MARK_VISIBLE (gpgrt_sysopen)
+MARK_VISIBLE (gpgrt_sysopen_nc)
+MARK_VISIBLE (gpgrt_fpopen)
+MARK_VISIBLE (gpgrt_fpopen_nc)
+MARK_VISIBLE (gpgrt_freopen)
+MARK_VISIBLE (gpgrt_fopencookie)
+MARK_VISIBLE (gpgrt_fclose)
+MARK_VISIBLE (gpgrt_fclose_snatch)
+MARK_VISIBLE (gpgrt_onclose)
+MARK_VISIBLE (gpgrt_fileno)
+MARK_VISIBLE (gpgrt_fileno_unlocked)
+MARK_VISIBLE (gpgrt_syshd)
+MARK_VISIBLE (gpgrt_syshd_unlocked)
+MARK_VISIBLE (_gpgrt_set_std_fd)
+MARK_VISIBLE (_gpgrt_get_std_stream)
+MARK_VISIBLE (gpgrt_flockfile)
+MARK_VISIBLE (gpgrt_ftrylockfile)
+MARK_VISIBLE (gpgrt_funlockfile)
+MARK_VISIBLE (_gpgrt_pending)
+MARK_VISIBLE (_gpgrt_pending_unlocked)
+MARK_VISIBLE (gpgrt_feof)
+MARK_VISIBLE (gpgrt_feof_unlocked)
+MARK_VISIBLE (gpgrt_ferror)
+MARK_VISIBLE (gpgrt_ferror_unlocked)
+MARK_VISIBLE (gpgrt_clearerr)
+MARK_VISIBLE (gpgrt_clearerr_unlocked)
+MARK_VISIBLE (gpgrt_fflush)
+MARK_VISIBLE (gpgrt_fseek)
+MARK_VISIBLE (gpgrt_fseeko)
+MARK_VISIBLE (gpgrt_ftell)
+MARK_VISIBLE (gpgrt_ftello)
+MARK_VISIBLE (gpgrt_rewind)
+MARK_VISIBLE (gpgrt_fgetc)
+MARK_VISIBLE (_gpgrt_getc_underflow)
+MARK_VISIBLE (gpgrt_fputc)
+MARK_VISIBLE (_gpgrt_putc_overflow)
+MARK_VISIBLE (gpgrt_ungetc)
+MARK_VISIBLE (gpgrt_read)
+MARK_VISIBLE (gpgrt_write)
+MARK_VISIBLE (gpgrt_write_sanitized)
+MARK_VISIBLE (gpgrt_write_hexstring)
+MARK_VISIBLE (gpgrt_fread)
+MARK_VISIBLE (gpgrt_fwrite)
+MARK_VISIBLE (gpgrt_fgets)
+MARK_VISIBLE (gpgrt_fputs)
+MARK_VISIBLE (gpgrt_fputs_unlocked)
+MARK_VISIBLE (gpgrt_getline)
+MARK_VISIBLE (gpgrt_read_line)
+MARK_VISIBLE (gpgrt_free)
+MARK_VISIBLE (gpgrt_fprintf)
+MARK_VISIBLE (gpgrt_fprintf_unlocked)
+MARK_VISIBLE (gpgrt_printf)
+MARK_VISIBLE (gpgrt_printf_unlocked)
+MARK_VISIBLE (gpgrt_vfprintf)
+MARK_VISIBLE (gpgrt_vfprintf_unlocked)
+MARK_VISIBLE (gpgrt_setvbuf)
+MARK_VISIBLE (gpgrt_setbuf)
+MARK_VISIBLE (gpgrt_set_binary)
+MARK_VISIBLE (gpgrt_set_nonblock)
+MARK_VISIBLE (gpgrt_get_nonblock)
+MARK_VISIBLE (gpgrt_poll)
+MARK_VISIBLE (gpgrt_tmpfile)
+MARK_VISIBLE (gpgrt_opaque_set)
+MARK_VISIBLE (gpgrt_opaque_get)
+MARK_VISIBLE (gpgrt_fname_set)
+MARK_VISIBLE (gpgrt_fname_get)
+MARK_VISIBLE (gpgrt_asprintf)
+MARK_VISIBLE (gpgrt_vasprintf)
+MARK_VISIBLE (gpgrt_bsprintf)
+MARK_VISIBLE (gpgrt_vbsprintf)
+MARK_VISIBLE (gpgrt_snprintf)
+MARK_VISIBLE (gpgrt_vsnprintf)
+MARK_VISIBLE (gpgrt_set_syscall_clamp)
+MARK_VISIBLE (gpgrt_get_syscall_clamp)
+MARK_VISIBLE (gpgrt_set_alloc_func)
+
+MARK_VISIBLE (gpgrt_b64dec_start)
+MARK_VISIBLE (gpgrt_b64dec_proc)
+MARK_VISIBLE (gpgrt_b64dec_finish)
+
+#undef MARK_VISIBLE
+
+#else /*!_GPGRT_INCL_BY_VISIBILITY_C*/
+
+/* To avoid accidental use of the public functions inside Libgpg-error,
+ we redefine them to catch such errors. */
+
+#define gpg_strerror _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_strerror_r _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_strsource _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_err_code_from_errno _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_err_code_to_errno _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_err_code_from_syserror _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_err_set_errno _gpgrt_USE_UNDERSCORED_FUNCTION
+
+#define gpg_err_init _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_err_deinit _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpg_error_check_version _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_check_version _gpgrt_USE_OTHER_FUNCTION
+
+#define gpgrt_lock_init _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_lock_lock _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_lock_unlock _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_lock_destroy _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_yield _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_lock_trylock _gpgrt_USE_UNDERSCORED_FUNCTION
+
+#define gpgrt_fopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_mopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fopenmem _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fopenmem_init _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fdopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fdopen_nc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_sysopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_sysopen_nc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fpopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fpopen_nc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_freopen _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fopencookie _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fclose _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fclose_snatch _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_onclose _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fileno _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fileno_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_syshd _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_syshd_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_set_std_fd _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_get_std_stream _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_flockfile _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_ftrylockfile _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_funlockfile _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_pending _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_pending_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_feof _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_feof_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_ferror _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_ferror_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_clearerr _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_clearerr_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fflush _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fseek _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fseeko _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_ftell _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_ftello _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_rewind _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fgetc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_getc_underflow _gpgrt_USE_DBLUNDERSCO_FUNCTION
+#define gpgrt_fputc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define _gpgrt_putc_overflow _gpgrt_USE_DBLUNDERSCO_FUNCTION
+#define gpgrt_ungetc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_read _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_write _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_write_sanitized _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_write_hexstring _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fread _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fwrite _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fgets _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fputs _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fputs_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_getline _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_read_line _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_free _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fprintf_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_printf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_printf_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_vfprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_vfprintf_unlocked _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_setvbuf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_setbuf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_set_binary _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_set_nonblock _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_get_nonblock _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_poll _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_tmpfile _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_opaque_set _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_opaque_get _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fname_set _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_fname_get _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_asprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_vasprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_bsprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_vbsprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_snprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_vsnprintf _gpgrt_USE_UNDERSCORED_FUNCTION
+
+#define gpgrt_set_syscall_clamp _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_get_syscall_clamp _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_set_alloc_func _gpgrt_USE_UNDERSCORED_FUNCTION
+
+#define gpgrt_b64dec_start _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_b64dec_proc _gpgrt_USE_UNDERSCORED_FUNCTION
+#define gpgrt_b64dec_finish _gpgrt_USE_UNDERSCORED_FUNCTION
+
+#endif /*!_GPGRT_INCL_BY_VISIBILITY_C*/
+
+#endif /*_GPGRT_VISIBILITY_H*/
diff --git a/src/w32-add.h b/src/w32-add.h
index 02848ac..5db6500 100644
--- a/src/w32-add.h
+++ b/src/w32-add.h
@@ -38,3 +38,21 @@ int _gpg_w32_gettext_use_utf8 (int value);
#endif /*GPG_ERR_ENABLE_GETTEXT_MACROS*/
+/* A simple iconv implementation w/o the need for an extra DLL. */
+struct _gpgrt_w32_iconv_s;
+typedef struct _gpgrt_w32_iconv_s *gpgrt_w32_iconv_t;
+
+gpgrt_w32_iconv_t gpgrt_w32_iconv_open (const char *tocode,
+ const char *fromcode);
+int gpgrt_w32_iconv_close (gpgrt_w32_iconv_t cd);
+size_t gpgrt_w32_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft);
+
+#ifdef GPGRT_ENABLE_W32_ICONV_MACROS
+# define ICONV_CONST const
+# define iconv_t gpgrt_w32_iconv_t
+# define iconv_open(a,b) gpgrt_w32_iconv_open ((a), (b))
+# define iconv_close(a) gpgrt_w32_iconv_close ((a))
+# define iconv(a,b,c,d,e) gpgrt_w32_iconv ((a),(b),(c),(d),(e))
+#endif /*GPGRT_ENABLE_W32_ICONV_MACROS*/
diff --git a/src/w32-estream.c b/src/w32-estream.c
new file mode 100644
index 0000000..d9a4d36
--- /dev/null
+++ b/src/w32-estream.c
@@ -0,0 +1,1075 @@
+/* w32-estream.c - es_poll support on W32.
+ * Copyright (C) 2000 Werner Koch (dd9jn)
+ * Copyright (C) 2001, 2002, 2003, 2004, 2007, 2010, 2016 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This file is based on GPGME's w32-io.c started in 2001.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#include <io.h>
+#include <windows.h>
+
+/* Enable tracing. The value is the module name to be printed. */
+/*#define ENABLE_TRACING "estream" */
+
+#include "gpgrt-int.h"
+
+/*
+ * In order to support es_poll on Windows, we create a proxy shim that
+ * we use as the estream I/O functions. This shim creates reader and
+ * writer threads that use the original I/O functions.
+ */
+
+
+/* Calculate array dimension. */
+#ifndef DIM
+#define DIM(array) (sizeof (array) / sizeof (*array))
+#endif
+
+#define READBUF_SIZE 4096
+#define WRITEBUF_SIZE 4096
+
+
+typedef struct estream_cookie_w32_pollable *estream_cookie_w32_pollable_t;
+
+struct reader_context_s
+{
+ estream_cookie_w32_pollable_t pcookie;
+ HANDLE thread_hd;
+
+ CRITICAL_SECTION mutex;
+
+ int stop_me;
+ int eof;
+ int eof_shortcut;
+ int error;
+ int error_code;
+
+ /* This is manually reset. */
+ HANDLE have_data_ev;
+ /* This is automatically reset. */
+ HANDLE have_space_ev;
+ /* This is manually reset but actually only triggered once. */
+ HANDLE close_ev;
+
+ size_t readpos, writepos;
+ char buffer[READBUF_SIZE];
+};
+
+struct writer_context_s
+{
+ estream_cookie_w32_pollable_t pcookie;
+ HANDLE thread_hd;
+
+ CRITICAL_SECTION mutex;
+
+ int stop_me;
+ int error;
+ int error_code;
+
+ /* This is manually reset. */
+ HANDLE have_data;
+ HANDLE is_empty;
+ HANDLE close_ev;
+ size_t nbytes;
+ char buffer[WRITEBUF_SIZE];
+};
+
+/* Cookie for pollable objects. */
+struct estream_cookie_w32_pollable
+{
+ unsigned int modeflags;
+
+ struct cookie_io_functions_s next_functions;
+ void *next_cookie;
+
+ struct reader_context_s *reader;
+ struct writer_context_s *writer;
+};
+
+
+static HANDLE
+set_synchronize (HANDLE hd)
+{
+#ifdef HAVE_W32CE_SYSTEM
+ return hd;
+#else
+ HANDLE new_hd;
+
+ /* For NT we have to set the sync flag. It seems that the only way
+ to do it is by duplicating the handle. Tsss... */
+ if (!DuplicateHandle (GetCurrentProcess (), hd,
+ GetCurrentProcess (), &new_hd,
+ EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, 0))
+ {
+ trace_errno (1, ("DuplicateHandle failed: ec=%d", (int)GetLastError ()));
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ CloseHandle (hd);
+ return new_hd;
+#endif
+}
+
+
+static DWORD CALLBACK
+reader (void *arg)
+{
+ struct reader_context_s *ctx = arg;
+ int nbytes;
+ ssize_t nread;
+
+ trace (("%p: reader starting", ctx));
+
+ for (;;)
+ {
+ EnterCriticalSection (&ctx->mutex);
+ /* Leave a 1 byte gap so that we can see whether it is empty or
+ full. */
+ while ((ctx->writepos + 1) % READBUF_SIZE == ctx->readpos)
+ {
+ /* Wait for space. */
+ if (!ResetEvent (ctx->have_space_ev))
+ trace (("%p: ResetEvent failed: ec=%d", ctx, (int)GetLastError()));
+ LeaveCriticalSection (&ctx->mutex);
+ trace (("%p: waiting for space", ctx));
+ WaitForSingleObject (ctx->have_space_ev, INFINITE);
+ trace (("%p: got space", ctx));
+ EnterCriticalSection (&ctx->mutex);
+ }
+ assert (((ctx->writepos + 1) % READBUF_SIZE != ctx->readpos));
+ if (ctx->stop_me)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ break;
+ }
+ nbytes = (ctx->readpos + READBUF_SIZE
+ - ctx->writepos - 1) % READBUF_SIZE;
+ assert (nbytes);
+ if (nbytes > READBUF_SIZE - ctx->writepos)
+ nbytes = READBUF_SIZE - ctx->writepos;
+ LeaveCriticalSection (&ctx->mutex);
+
+ trace (("%p: reading up to %d bytes", ctx, nbytes));
+
+ nread = ctx->pcookie->next_functions.public.func_read
+ (ctx->pcookie->next_cookie, ctx->buffer + ctx->writepos, nbytes);
+ trace (("%p: got %d bytes", ctx, nread));
+ if (nread < 0)
+ {
+ ctx->error_code = (int) errno;
+ /* NOTE (W32CE): Do not ignore ERROR_BUSY! Check at
+ least stop_me if that happens. */
+ if (ctx->error_code == ERROR_BROKEN_PIPE)
+ {
+ ctx->eof = 1;
+ trace (("%p: got EOF (broken pipe)", ctx));
+ }
+ else
+ {
+ ctx->error = 1;
+ trace (("%p: read error: ec=%d", ctx, ctx->error_code));
+ }
+ break;
+ }
+
+ EnterCriticalSection (&ctx->mutex);
+ if (ctx->stop_me)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ break;
+ }
+ if (!nread)
+ {
+ ctx->eof = 1;
+ trace (("%p: got eof", ctx));
+ LeaveCriticalSection (&ctx->mutex);
+ break;
+ }
+
+ ctx->writepos = (ctx->writepos + nread) % READBUF_SIZE;
+ if (!SetEvent (ctx->have_data_ev))
+ trace (("%p: SetEvent (%p) failed: ec=%d",
+ ctx, ctx->have_data_ev, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ }
+ /* Indicate that we have an error or EOF. */
+ if (!SetEvent (ctx->have_data_ev))
+ trace (("%p: SetEvent (%p) failed: ec=%d",
+ ctx, ctx->have_data_ev, (int)GetLastError ()));
+
+ trace (("%p: waiting for close", ctx));
+ WaitForSingleObject (ctx->close_ev, INFINITE);
+
+ CloseHandle (ctx->close_ev);
+ CloseHandle (ctx->have_data_ev);
+ CloseHandle (ctx->have_space_ev);
+ CloseHandle (ctx->thread_hd);
+ DeleteCriticalSection (&ctx->mutex);
+ _gpgrt_free (ctx);
+
+ return 0;
+}
+
+
+static struct reader_context_s *
+create_reader (estream_cookie_w32_pollable_t pcookie)
+{
+ struct reader_context_s *ctx;
+ SECURITY_ATTRIBUTES sec_attr;
+ DWORD tid;
+
+ memset (&sec_attr, 0, sizeof sec_attr);
+ sec_attr.nLength = sizeof sec_attr;
+ sec_attr.bInheritHandle = FALSE;
+
+ ctx = calloc (1, sizeof *ctx);
+ if (!ctx)
+ {
+ return NULL;
+ }
+
+ ctx->pcookie = pcookie;
+
+ ctx->have_data_ev = CreateEvent (&sec_attr, TRUE, FALSE, NULL);
+ if (ctx->have_data_ev)
+ ctx->have_space_ev = CreateEvent (&sec_attr, FALSE, TRUE, NULL);
+ if (ctx->have_space_ev)
+ ctx->close_ev = CreateEvent (&sec_attr, TRUE, FALSE, NULL);
+ if (!ctx->have_data_ev || !ctx->have_space_ev || !ctx->close_ev)
+ {
+ trace (("%p: CreateEvent failed: ec=%d", ctx, (int)GetLastError ()));
+ if (ctx->have_data_ev)
+ CloseHandle (ctx->have_data_ev);
+ if (ctx->have_space_ev)
+ CloseHandle (ctx->have_space_ev);
+ if (ctx->close_ev)
+ CloseHandle (ctx->close_ev);
+ _gpgrt_free (ctx);
+ return NULL;
+ }
+
+ ctx->have_data_ev = set_synchronize (ctx->have_data_ev);
+ InitializeCriticalSection (&ctx->mutex);
+
+#ifdef HAVE_W32CE_SYSTEM
+ ctx->thread_hd = CreateThread (&sec_attr, 64 * 1024, reader, ctx,
+ STACK_SIZE_PARAM_IS_A_RESERVATION, &tid);
+#else
+ ctx->thread_hd = CreateThread (&sec_attr, 0, reader, ctx, 0, &tid);
+#endif
+
+ if (!ctx->thread_hd)
+ {
+ trace (("%p: CreateThread failed: ec=%d", ctx, (int)GetLastError ()));
+ DeleteCriticalSection (&ctx->mutex);
+ if (ctx->have_data_ev)
+ CloseHandle (ctx->have_data_ev);
+ if (ctx->have_space_ev)
+ CloseHandle (ctx->have_space_ev);
+ if (ctx->close_ev)
+ CloseHandle (ctx->close_ev);
+ _gpgrt_free (ctx);
+ return NULL;
+ }
+ else
+ {
+#if 0
+ /* We set the priority of the thread higher because we know that
+ it only runs for a short time. This greatly helps to
+ increase the performance of the I/O. */
+ SetThreadPriority (ctx->thread_hd, get_desired_thread_priority ());
+#endif
+ }
+
+ return ctx;
+}
+
+
+/* Prepare destruction of the reader thread for CTX. Returns 0 if a
+ call to this function is sufficient and destroy_reader_finish shall
+ not be called. */
+static void
+destroy_reader (struct reader_context_s *ctx)
+{
+ EnterCriticalSection (&ctx->mutex);
+ ctx->stop_me = 1;
+ if (ctx->have_space_ev)
+ SetEvent (ctx->have_space_ev);
+ LeaveCriticalSection (&ctx->mutex);
+
+#ifdef HAVE_W32CE_SYSTEM
+ /* Scenario: We never create a full pipe, but already started
+ reading. Then we need to unblock the reader in the pipe driver
+ to make our reader thread notice that we want it to go away. */
+
+ if (ctx->file_hd != INVALID_HANDLE_VALUE)
+ {
+ if (!DeviceIoControl (ctx->file_hd, GPGCEDEV_IOCTL_UNBLOCK,
+ NULL, 0, NULL, 0, NULL, NULL))
+ {
+ trace (("%p: unblock control call failed: ec=%d",
+ ctx, (int)GetLastError ()));
+ }
+ }
+#endif
+
+ /* XXX is it feasible to unblock the thread? */
+
+ /* After setting this event CTX is void. */
+ SetEvent (ctx->close_ev);
+}
+
+
+/*
+ * Read function for pollable objects.
+ */
+static gpgrt_ssize_t
+func_w32_pollable_read (void *cookie, void *buffer, size_t count)
+{
+ estream_cookie_w32_pollable_t pcookie = cookie;
+ gpgrt_ssize_t nread;
+ struct reader_context_s *ctx;
+
+ trace (("%p: enter buffer=%p count=%u", cookie, buffer, count));
+
+ /* FIXME: implement pending check if COUNT==0 */
+
+ ctx = pcookie->reader;
+ if (ctx == NULL)
+ {
+ pcookie->reader = ctx = create_reader (pcookie);
+ if (!ctx)
+ {
+ _gpg_err_set_errno (EBADF);
+ nread = -1;
+ goto leave;
+ }
+ trace (("%p: new reader %p", cookie, pcookie->reader));
+ }
+
+ if (ctx->eof_shortcut)
+ {
+ nread = 0;
+ goto leave;
+ }
+
+ EnterCriticalSection (&ctx->mutex);
+ trace (("%p: readpos: %d, writepos %d", cookie, ctx->readpos, ctx->writepos));
+ if (ctx->readpos == ctx->writepos && !ctx->error)
+ {
+ /* No data available. */
+ int eof = ctx->eof;
+
+ LeaveCriticalSection (&ctx->mutex);
+
+ if (pcookie->modeflags & O_NONBLOCK && ! eof)
+ {
+ _gpg_err_set_errno (EAGAIN);
+ nread = -1;
+ goto leave;
+ }
+
+ trace (("%p: waiting for data", cookie));
+ WaitForSingleObject (ctx->have_data_ev, INFINITE);
+ trace (("%p: data available", cookie));
+ EnterCriticalSection (&ctx->mutex);
+ }
+
+ if (ctx->readpos == ctx->writepos || ctx->error)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ ctx->eof_shortcut = 1;
+ if (ctx->eof)
+ return 0;
+ if (!ctx->error)
+ {
+ trace (("%p: EOF but ctx->eof flag not set", cookie));
+ nread = 0;
+ goto leave;
+ }
+ _gpg_err_set_errno (ctx->error_code);
+ return -1;
+ }
+
+ nread = ctx->readpos < ctx->writepos
+ ? ctx->writepos - ctx->readpos
+ : READBUF_SIZE - ctx->readpos;
+ if (nread > count)
+ nread = count;
+ memcpy (buffer, ctx->buffer + ctx->readpos, nread);
+ ctx->readpos = (ctx->readpos + nread) % READBUF_SIZE;
+ if (ctx->readpos == ctx->writepos && !ctx->eof)
+ {
+ if (!ResetEvent (ctx->have_data_ev))
+ {
+ trace (("%p: ResetEvent failed: ec=%d",
+ cookie, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ nread = -1;
+ goto leave;
+ }
+ }
+ if (!SetEvent (ctx->have_space_ev))
+ {
+ trace (("%p: SetEvent (%p) failed: ec=%d",
+ cookie, ctx->have_space_ev, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ nread = -1;
+ goto leave;
+ }
+ LeaveCriticalSection (&ctx->mutex);
+
+ leave:
+ trace_errno (nread==-1,("%p: leave nread=%d", cookie, (int)nread));
+ return nread;
+}
+
+
+/* The writer does use a simple buffering strategy so that we are
+ informed about write errors as soon as possible (i. e. with the the
+ next call to the write function. */
+static DWORD CALLBACK
+writer (void *arg)
+{
+ struct writer_context_s *ctx = arg;
+ ssize_t nwritten;
+
+ trace (("%p: writer starting", ctx));
+
+ for (;;)
+ {
+ EnterCriticalSection (&ctx->mutex);
+ if (ctx->stop_me && !ctx->nbytes)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ break;
+ }
+ if (!ctx->nbytes)
+ {
+ if (!SetEvent (ctx->is_empty))
+ trace (("%p: SetEvent failed: ec=%d", ctx, (int)GetLastError ()));
+ if (!ResetEvent (ctx->have_data))
+ trace (("%p: ResetEvent failed: ec=%d", ctx, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ trace (("%p: idle", ctx));
+ WaitForSingleObject (ctx->have_data, INFINITE);
+ trace (("%p: got data to write", ctx));
+ EnterCriticalSection (&ctx->mutex);
+ }
+ if (ctx->stop_me && !ctx->nbytes)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ break;
+ }
+ LeaveCriticalSection (&ctx->mutex);
+
+ trace (("%p: writing up to %d bytes", ctx, ctx->nbytes));
+
+ nwritten = ctx->pcookie->next_functions.public.func_write
+ (ctx->pcookie->next_cookie, ctx->buffer, ctx->nbytes);
+ trace (("%p: wrote %d bytes", ctx, nwritten));
+ if (nwritten < 1)
+ {
+ /* XXX */
+ if (errno == ERROR_BUSY)
+ {
+ /* Probably stop_me is set now. */
+ trace (("%p: pipe busy (unblocked?)", ctx));
+ continue;
+ }
+
+ ctx->error_code = errno;
+ ctx->error = 1;
+ trace (("%p: write error: ec=%d", ctx, ctx->error_code));
+ break;
+ }
+
+ EnterCriticalSection (&ctx->mutex);
+ ctx->nbytes -= nwritten;
+ LeaveCriticalSection (&ctx->mutex);
+ }
+ /* Indicate that we have an error. */
+ if (!SetEvent (ctx->is_empty))
+ trace (("%p: SetEvent failed: ec=%d", ctx, (int)GetLastError ()));
+
+ trace (("%p: waiting for close", ctx));
+ WaitForSingleObject (ctx->close_ev, INFINITE);
+
+ if (ctx->nbytes)
+ trace (("%p: still %d bytes in buffer at close time", ctx, ctx->nbytes));
+
+ CloseHandle (ctx->close_ev);
+ CloseHandle (ctx->have_data);
+ CloseHandle (ctx->is_empty);
+ CloseHandle (ctx->thread_hd);
+ DeleteCriticalSection (&ctx->mutex);
+ trace (("%p: writer is destroyed", ctx));
+ _gpgrt_free (ctx);
+
+ return 0;
+}
+
+
+static struct writer_context_s *
+create_writer (estream_cookie_w32_pollable_t pcookie)
+{
+ struct writer_context_s *ctx;
+ SECURITY_ATTRIBUTES sec_attr;
+ DWORD tid;
+
+ memset (&sec_attr, 0, sizeof sec_attr);
+ sec_attr.nLength = sizeof sec_attr;
+ sec_attr.bInheritHandle = FALSE;
+
+ ctx = calloc (1, sizeof *ctx);
+ if (!ctx)
+ {
+ return NULL;
+ }
+
+ ctx->pcookie = pcookie;
+
+ ctx->have_data = CreateEvent (&sec_attr, TRUE, FALSE, NULL);
+ if (ctx->have_data)
+ ctx->is_empty = CreateEvent (&sec_attr, TRUE, TRUE, NULL);
+ if (ctx->is_empty)
+ ctx->close_ev = CreateEvent (&sec_attr, TRUE, FALSE, NULL);
+ if (!ctx->have_data || !ctx->is_empty || !ctx->close_ev)
+ {
+ trace (("%p: CreateEvent failed: ec=%d", ctx, (int)GetLastError ()));
+ if (ctx->have_data)
+ CloseHandle (ctx->have_data);
+ if (ctx->is_empty)
+ CloseHandle (ctx->is_empty);
+ if (ctx->close_ev)
+ CloseHandle (ctx->close_ev);
+ _gpgrt_free (ctx);
+ return NULL;
+ }
+
+ ctx->is_empty = set_synchronize (ctx->is_empty);
+ InitializeCriticalSection (&ctx->mutex);
+
+#ifdef HAVE_W32CE_SYSTEM
+ ctx->thread_hd = CreateThread (&sec_attr, 64 * 1024, writer, ctx,
+ STACK_SIZE_PARAM_IS_A_RESERVATION, &tid);
+#else
+ ctx->thread_hd = CreateThread (&sec_attr, 0, writer, ctx, 0, &tid );
+#endif
+
+ if (!ctx->thread_hd)
+ {
+ trace (("%p: CreateThread failed: ec=%d", ctx, (int)GetLastError ()));
+ DeleteCriticalSection (&ctx->mutex);
+ if (ctx->have_data)
+ CloseHandle (ctx->have_data);
+ if (ctx->is_empty)
+ CloseHandle (ctx->is_empty);
+ if (ctx->close_ev)
+ CloseHandle (ctx->close_ev);
+ _gpgrt_free (ctx);
+ return NULL;
+ }
+ else
+ {
+#if 0
+ /* We set the priority of the thread higher because we know
+ that it only runs for a short time. This greatly helps to
+ increase the performance of the I/O. */
+ SetThreadPriority (ctx->thread_hd, get_desired_thread_priority ());
+#endif
+ }
+
+ return ctx;
+}
+
+
+static void
+destroy_writer (struct writer_context_s *ctx)
+{
+ trace (("%p: enter pollable_destroy_writer", ctx));
+ EnterCriticalSection (&ctx->mutex);
+ trace (("%p: setting stopme", ctx));
+ ctx->stop_me = 1;
+ if (ctx->have_data)
+ SetEvent (ctx->have_data);
+ LeaveCriticalSection (&ctx->mutex);
+
+ trace (("%p: waiting for empty", ctx));
+
+ /* Give the writer a chance to flush the buffer. */
+ WaitForSingleObject (ctx->is_empty, INFINITE);
+
+#ifdef HAVE_W32CE_SYSTEM
+ /* Scenario: We never create a full pipe, but already started
+ writing more than the pipe buffer. Then we need to unblock the
+ writer in the pipe driver to make our writer thread notice that
+ we want it to go away. */
+
+ if (!DeviceIoControl (ctx->file_hd, GPGCEDEV_IOCTL_UNBLOCK,
+ NULL, 0, NULL, 0, NULL, NULL))
+ {
+ trace (("%p: unblock control call failed: ec=%d",
+ ctx, (int)GetLastError ()));
+ }
+#endif
+
+ /* After setting this event CTX is void. */
+ trace (("%p: set close_ev", ctx));
+ SetEvent (ctx->close_ev);
+ trace (("%p: leave pollable_destroy_writer", ctx));
+}
+
+
+/*
+ * Write function for pollable objects.
+ */
+static gpgrt_ssize_t
+func_w32_pollable_write (void *cookie, const void *buffer, size_t count)
+{
+ estream_cookie_w32_pollable_t pcookie = cookie;
+ struct writer_context_s *ctx = pcookie->writer;
+ int nwritten;
+
+ trace (("%p: enter buffer: %p count: %d", cookie, buffer, count));
+ if (count == 0)
+ {
+ nwritten = 0;
+ goto leave;
+ }
+
+ if (ctx == NULL)
+ {
+ pcookie->writer = ctx = create_writer (pcookie);
+ if (!ctx)
+ {
+ nwritten = -1;
+ goto leave;
+ }
+ trace (("%p: new writer %p", cookie, pcookie->writer));
+ }
+
+ EnterCriticalSection (&ctx->mutex);
+ trace (("%p: buffer: %p, count: %d, nbytes: %d",
+ cookie, buffer, count, ctx->nbytes));
+ if (!ctx->error && ctx->nbytes)
+ {
+ /* Bytes are pending for send. */
+
+ /* Reset the is_empty event. Better safe than sorry. */
+ if (!ResetEvent (ctx->is_empty))
+ {
+ trace (("%p: ResetEvent failed: ec=%d",
+ cookie, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ nwritten = -1;
+ goto leave;
+ }
+ LeaveCriticalSection (&ctx->mutex);
+
+ if (pcookie->modeflags & O_NONBLOCK)
+ {
+ trace (("%p: would block", cookie));
+ _gpg_err_set_errno (EAGAIN);
+ nwritten = -1;
+ goto leave;
+ }
+
+ trace (("%p: waiting for empty buffer", cookie));
+ WaitForSingleObject (ctx->is_empty, INFINITE);
+ trace (("%p: buffer is empty", cookie));
+ EnterCriticalSection (&ctx->mutex);
+ }
+
+ if (ctx->error)
+ {
+ LeaveCriticalSection (&ctx->mutex);
+ if (ctx->error_code == ERROR_NO_DATA)
+ _gpg_err_set_errno (EPIPE);
+ else
+ _gpg_err_set_errno (EIO);
+ nwritten = -1;
+ goto leave;
+ }
+
+ /* If no error occurred, the number of bytes in the buffer must be
+ zero. */
+ assert (!ctx->nbytes);
+
+ if (count > WRITEBUF_SIZE)
+ count = WRITEBUF_SIZE;
+ memcpy (ctx->buffer, buffer, count);
+ ctx->nbytes = count;
+
+ /* We have to reset the is_empty event early, because it is also
+ used by the select() implementation to probe the channel. */
+ if (!ResetEvent (ctx->is_empty))
+ {
+ trace (("%p: ResetEvent failed: ec=%d", cookie, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ nwritten = -1;
+ goto leave;
+ }
+ if (!SetEvent (ctx->have_data))
+ {
+ trace (("%p: SetEvent failed: ec=%d", cookie, (int)GetLastError ()));
+ LeaveCriticalSection (&ctx->mutex);
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ nwritten = -1;
+ goto leave;
+ }
+ LeaveCriticalSection (&ctx->mutex);
+
+ nwritten = count;
+
+ leave:
+ trace_errno (nwritten==-1,("%p: leave nwritten=%d", cookie, nwritten));
+ return nwritten;
+}
+
+
+int
+_gpgrt_w32_poll (gpgrt_poll_t *fds, size_t nfds, int timeout)
+{
+ HANDLE waitbuf[MAXIMUM_WAIT_OBJECTS];
+ int waitidx[MAXIMUM_WAIT_OBJECTS];
+ char waitinfo[MAXIMUM_WAIT_OBJECTS];
+ unsigned int code;
+ int nwait;
+ int i;
+ int any;
+ int count;
+
+#if 0
+ restart:
+#endif
+
+ any = 0;
+ nwait = 0;
+ count = 0;
+ for (i = 0; i < nfds; i++)
+ {
+ struct estream_cookie_w32_pollable *pcookie;
+
+ if (fds[i].ignore)
+ continue;
+
+ if (fds[i].stream->intern->kind != BACKEND_W32_POLLABLE)
+ {
+ /* This stream does not support polling. */
+ fds[i].got_err = 1;
+ continue;
+ }
+
+ pcookie = fds[i].stream->intern->cookie;
+
+ if (fds[i].want_read || fds[i].want_write)
+ {
+ /* XXX: What if one wants read and write, is that supported? */
+ if (fds[i].want_read)
+ {
+ struct reader_context_s *ctx = pcookie->reader;
+ if (ctx == NULL)
+ {
+ pcookie->reader = ctx = create_reader (pcookie);
+ if (!ctx)
+ {
+ /* FIXME: Is the error code appropriate? */
+ _gpg_err_set_errno (EBADF);
+ return -1;
+ }
+ trace (("%p: new reader %p", pcookie, pcookie->reader));
+ }
+ trace (("%p: using reader %p", pcookie, pcookie->reader));
+
+ if (nwait >= DIM (waitbuf))
+ {
+ trace (("oops: too many objects for WFMO"));
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ return -1;
+ }
+ waitidx[nwait] = i;
+ waitinfo[nwait] = 'r';
+ waitbuf[nwait++] = ctx->have_data_ev;
+ any = 1;
+ }
+ else if (fds[i].want_write)
+ {
+ struct writer_context_s *ctx = pcookie->writer;
+ if (ctx == NULL)
+ {
+ pcookie->writer = ctx = create_writer (pcookie);
+ if (!ctx)
+ {
+ trace (("oops: create writer failed"));
+ /* FIXME: Is the error code appropriate? */
+ _gpg_err_set_errno (EBADF);
+ return -1;
+ }
+ trace (("%p: new writer %p", pcookie, pcookie->writer));
+ }
+ trace (("%p: using writer %p", pcookie, pcookie->writer));
+
+ if (nwait >= DIM (waitbuf))
+ {
+ trace (("oops: Too many objects for WFMO"));
+ /* FIXME: Should translate the error code. */
+ _gpg_err_set_errno (EIO);
+ return -1;
+ }
+ waitidx[nwait] = i;
+ waitinfo[nwait] = 'w';
+ waitbuf[nwait++] = ctx->is_empty;
+ any = 1;
+ }
+ }
+ }
+ trace_start (("poll on [ "));
+ for (i = 0; i < nwait; i++)
+ trace_append (("%d/%c ", waitidx[i], waitinfo[i]));
+ trace_finish (("]"));
+ if (!any)
+ return 0;
+
+ code = WaitForMultipleObjects (nwait, waitbuf, 0,
+ timeout == -1 ? INFINITE : timeout);
+ if (code < WAIT_OBJECT_0 + nwait)
+ {
+ /* This WFMO is a really silly function: It does return either
+ the index of the signaled object or if 2 objects have been
+ signalled at the same time, the index of the object with the
+ lowest object is returned - so and how do we find out how
+ many objects have been signaled???. The only solution I can
+ imagine is to test each object starting with the returned
+ index individually - how dull. */
+ any = 0;
+ for (i = code - WAIT_OBJECT_0; i < nwait; i++)
+ {
+ if (WaitForSingleObject (waitbuf[i], 0) == WAIT_OBJECT_0)
+ {
+ assert (waitidx[i] >=0 && waitidx[i] < nfds);
+ /* XXX: What if one wants read and write, is that
+ supported? */
+ if (fds[waitidx[i]].want_read)
+ fds[waitidx[i]].got_read = 1;
+ else if (fds[waitidx[i]].want_write)
+ fds[waitidx[i]].got_write = 1;
+ any = 1;
+ count++;
+ }
+ }
+ if (!any)
+ {
+ trace (("no signaled objects found after WFMO"));
+ count = -1;
+ }
+ }
+ else if (code == WAIT_TIMEOUT)
+ trace (("WFMO timed out"));
+ else if (code == WAIT_FAILED)
+ {
+ trace (("WFMO failed: ec=%d", (int)GetLastError ()));
+#if 0
+ if (GetLastError () == ERROR_INVALID_HANDLE)
+ {
+ int k;
+ int j = handle_to_fd (waitbuf[i]);
+
+ trace (("WFMO invalid handle %d removed", j));
+ for (k = 0 ; k < nfds; k++)
+ {
+ if (fds[k].fd == j)
+ {
+ fds[k].want_read = fds[k].want_write = 0;
+ goto restart;
+ }
+ }
+ trace ((" oops, or not???"));
+ }
+#endif
+ count = -1;
+ }
+ else
+ {
+ trace (("WFMO returned %u", code));
+ count = -1;
+ }
+
+ if (count > 0)
+ {
+ trace_start (("poll OK [ "));
+ for (i = 0; i < nfds; i++)
+ {
+ if (fds[i].ignore)
+ continue;
+ if (fds[i].got_read || fds[i].got_write)
+ trace_append (("%c%d ", fds[i].want_read ? 'r' : 'w', i));
+ }
+ trace_finish (("]"));
+ }
+
+ if (count < 0)
+ {
+ /* FIXME: Should determine a proper error code. */
+ _gpg_err_set_errno (EIO);
+ }
+
+ return count;
+}
+
+
+
+/*
+ * Implementation of pollable I/O on Windows.
+ */
+
+/*
+ * Constructor for pollable objects.
+ */
+int
+_gpgrt_w32_pollable_create (void *_GPGRT__RESTRICT *_GPGRT__RESTRICT cookie,
+ unsigned int modeflags,
+ struct cookie_io_functions_s next_functions,
+ void *next_cookie)
+{
+ estream_cookie_w32_pollable_t pcookie;
+ int err;
+
+ pcookie = _gpgrt_malloc (sizeof *pcookie);
+ if (!pcookie)
+ err = -1;
+ else
+ {
+ pcookie->modeflags = modeflags;
+ pcookie->next_functions = next_functions;
+ pcookie->next_cookie = next_cookie;
+ pcookie->reader = NULL;
+ pcookie->writer = NULL;
+ *cookie = pcookie;
+ err = 0;
+ }
+
+ trace_errno (err,("cookie=%p", *cookie));
+ return err;
+}
+
+
+/*
+ * Seek function for pollable objects.
+ */
+static int
+func_w32_pollable_seek (void *cookie, gpgrt_off_t *offset, int whence)
+{
+ estream_cookie_w32_pollable_t pcookie = cookie;
+ (void) pcookie;
+ (void) offset;
+ (void) whence;
+ /* XXX */
+ _gpg_err_set_errno (EOPNOTSUPP);
+ return -1;
+}
+
+
+/*
+ * The IOCTL function for pollable objects.
+ */
+static int
+func_w32_pollable_ioctl (void *cookie, int cmd, void *ptr, size_t *len)
+{
+ estream_cookie_w32_pollable_t pcookie = cookie;
+ cookie_ioctl_function_t func_ioctl = pcookie->next_functions.func_ioctl;
+
+ if (cmd == COOKIE_IOCTL_NONBLOCK)
+ {
+ if (ptr)
+ pcookie->modeflags |= O_NONBLOCK;
+ else
+ pcookie->modeflags &= ~O_NONBLOCK;
+ return 0;
+ }
+
+ if (func_ioctl)
+ return func_ioctl (pcookie->next_cookie, cmd, ptr, len);
+
+ _gpg_err_set_errno (EOPNOTSUPP);
+ return -1;
+}
+
+
+/*
+ * The destroy function for pollable objects.
+ */
+static int
+func_w32_pollable_destroy (void *cookie)
+{
+ estream_cookie_w32_pollable_t pcookie = cookie;
+
+ if (cookie)
+ {
+ if (pcookie->reader)
+ destroy_reader (pcookie->reader);
+ if (pcookie->writer)
+ destroy_writer (pcookie->writer);
+ pcookie->next_functions.public.func_close (pcookie->next_cookie);
+ _gpgrt_free (pcookie);
+ }
+ return 0;
+}
+
+/*
+ * Access object for the pollable functions.
+ */
+struct cookie_io_functions_s _gpgrt_functions_w32_pollable =
+ {
+ {
+ func_w32_pollable_read,
+ func_w32_pollable_write,
+ func_w32_pollable_seek,
+ func_w32_pollable_destroy,
+ },
+ func_w32_pollable_ioctl,
+ };
diff --git a/src/w32-gettext.c b/src/w32-gettext.c
index 89f505d..3b54ebd 100644
--- a/src/w32-gettext.c
+++ b/src/w32-gettext.c
@@ -15,7 +15,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -108,7 +108,7 @@ MyCreateFileA (LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwSharedMode,
/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */
/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
-/* Renamed _nl_locale_name, removed unsed args, removed include files,
+/* Renamed _nl_locale_name, removed unused args, removed include files,
non-W32 code and changed comments <wk@gnupg.org>. */
/* Mingw headers don't have latest language and sublanguage codes. */
@@ -680,8 +680,7 @@ my_nl_locale_name (const char *categoryname)
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/ . */
+ For details about languages, see https://www.ethnologue.com/ . */
switch (primary)
{
case LANG_AFRIKAANS: return "af_ZA";
@@ -1039,11 +1038,7 @@ my_nl_locale_name (const char *categoryname)
}
return "uz";
case LANG_VENDA:
- /* FIXME: It's not clear whether Venda has the ISO 639-2 two-letter code
- "ve" or not.
- http://www.loc.gov/standards/iso639-2/englangn.html has it, but
- http://lcweb.loc.gov/standards/iso639-2/codechanges.html doesn't, */
- return "ven_ZA"; /* or "ve_ZA"? */
+ return "ve_ZA";
case LANG_VIETNAMESE: return "vi_VN";
case LANG_WELSH: return "cy_GB";
case LANG_XHOSA: return "xh_ZA";
@@ -1373,17 +1368,25 @@ utf8_to_wchar (const char *string, size_t length, size_t *retlen)
}
-/* Return a malloced string encoded in UTF-8 from the wide char input
- string STRING. Caller must free this value. On failure returns
- NULL. The result of calling this function with STRING set to NULL
+/* Return a malloced string encoded in the native console codepage
+ from the wide char input string STRING.
+ Caller must free this value. On failure returns NULL.
+ The result of calling this function with STRING set to NULL
is not defined. */
static char *
wchar_to_native (const wchar_t *string, size_t length, size_t *retlen)
{
int n;
char *result;
+ unsigned int cpno = GetConsoleOutputCP ();
+
+ /* GetConsoleOutputCP returns the 8-Bit codepage that should be used
+ for console output. If the codepage is not returned we fall back
+ to the codepage GUI programs should use (CP_ACP). */
+ if (!cpno)
+ cpno = GetACP ();
- n = WideCharToMultiByte (CP_ACP, 0, string, length, NULL, 0, NULL, NULL);
+ n = WideCharToMultiByte (cpno, 0, string, length, NULL, 0, NULL, NULL);
if (n < 0 || (n+1) <= 0)
return NULL;
@@ -1391,7 +1394,7 @@ wchar_to_native (const wchar_t *string, size_t length, size_t *retlen)
if (!result)
return NULL;
- n = WideCharToMultiByte (CP_ACP, 0, string, length, result, n, NULL, NULL);
+ n = WideCharToMultiByte (cpno, 0, string, length, result, n, NULL, NULL);
if (n < 0)
{
jnlib_free (result);
diff --git a/src/w32-iconv.c b/src/w32-iconv.c
new file mode 100644
index 0000000..c10bb32
--- /dev/null
+++ b/src/w32-iconv.c
@@ -0,0 +1,1793 @@
+/* w32-iconv.c - iconv implementation for Windows.
+ * Copyright (C) 2016 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ *
+ **************************************************************
+ * This code code is based on the file win_iconv.c as found
+ * at https://github.com/win-iconv/win-iconv with the commit id
+ * 8c23784e35327c9d85d22810b9e4a2cbd06ffe90, dated 2016-03-18.
+ * Yukihiro Nakadaira <yukihiro.nakadaira@gmail.com> is the
+ * original author. The file win_iconv.c carried this notice:
+ *--------------------------------------------------------------
+ * iconv implementation using Win32 API to convert.
+ *
+ * This file is placed in the public domain.
+ *---------------------------------------------------
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+#if !defined (_WIN32) && !defined (__CYGWIN32__)
+# error This module may only be build for Windows or Cygwin32
+#endif
+
+/* for WC_NO_BEST_FIT_CHARS */
+#ifndef WINVER
+# define WINVER 0x0500
+#endif
+
+#include <windows.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "gpgrt-int.h"
+
+#undef USE_MLANG_DLL
+
+#define MB_CHAR_MAX 16
+
+#define UNICODE_MODE_BOM_DONE 1
+#define UNICODE_MODE_SWAPPED 2
+
+#define FLAG_USE_BOM 1
+#define FLAG_TRANSLIT 2 /* //TRANSLIT */
+#define FLAG_IGNORE 4 /* //IGNORE */
+
+typedef unsigned char uchar;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+
+typedef struct compat_t compat_t;
+typedef struct csconv_t csconv_t;
+
+typedef int* (*f_errno)(void);
+typedef int (*f_mbtowc)(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+typedef int (*f_wctomb)(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+typedef int (*f_mblen)(csconv_t *cv, const uchar *buf, int bufsize);
+typedef int (*f_flush)(csconv_t *cv, uchar *buf, int bufsize);
+
+#define COMPAT_IN 1
+#define COMPAT_OUT 2
+
+/* unicode mapping for compatibility with other conversion table. */
+struct compat_t {
+ uint in;
+ uint out;
+ uint flag;
+};
+
+struct csconv_t {
+ int codepage;
+ int flags;
+ f_mbtowc mbtowc;
+ f_wctomb wctomb;
+ f_mblen mblen;
+ f_flush flush;
+ DWORD mode;
+ compat_t *compat;
+};
+
+struct _gpgrt_w32_iconv_s {
+ f_errno _errno;
+ csconv_t from;
+ csconv_t to;
+};
+
+#if USE_MLANG_DLL
+static int load_mlang(void);
+#endif /*USE_MLANG_DLL*/
+
+static int make_csconv(const char *name, csconv_t *cv);
+static int name_to_codepage(const char *name);
+static uint utf16_to_ucs4(const ushort *wbuf);
+static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize);
+static int mbtowc_flags(int codepage);
+static int must_use_null_useddefaultchar(int codepage);
+static char *strrstr(const char *str, const char *token);
+static char *xstrndup(const char *s, size_t n);
+static int seterror(int err);
+
+static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+#if USE_MLANG_DLL
+static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
+
+static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+
+#if USE_MLANG_DLL
+static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
+
+static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+
+#if USE_MLANG_DLL
+static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize);
+static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize);
+static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize);
+#endif /*USE_MLANG_DLL*/
+
+static struct {
+ int codepage;
+ const char *name;
+} codepage_alias[] = {
+ {65001, "CP65001"},
+ {65001, "UTF8"},
+ {65001, "UTF-8"},
+
+ {1200, "CP1200"},
+ {1200, "UTF16LE"},
+ {1200, "UTF-16LE"},
+ {1200, "UCS2LE"},
+ {1200, "UCS-2LE"},
+ {1200, "UCS-2-INTERNAL"},
+
+ {1201, "CP1201"},
+ {1201, "UTF16BE"},
+ {1201, "UTF-16BE"},
+ {1201, "UCS2BE"},
+ {1201, "UCS-2BE"},
+ {1201, "unicodeFFFE"},
+
+ {12000, "CP12000"},
+ {12000, "UTF32LE"},
+ {12000, "UTF-32LE"},
+ {12000, "UCS4LE"},
+ {12000, "UCS-4LE"},
+
+ {12001, "CP12001"},
+ {12001, "UTF32BE"},
+ {12001, "UTF-32BE"},
+ {12001, "UCS4BE"},
+ {12001, "UCS-4BE"},
+
+ /*
+ * Default is big endian.
+ * See rfc2781 4.3 Interpreting text labelled as UTF-16.
+ */
+ {1201, "UTF16"},
+ {1201, "UTF-16"},
+ {1201, "UCS2"},
+ {1201, "UCS-2"},
+ {12001, "UTF32"},
+ {12001, "UTF-32"},
+ {12001, "UCS-4"},
+ {12001, "UCS4"},
+
+ /* copy from libiconv `iconv -l` */
+ /* !IsValidCodePage(367) */
+ {20127, "ANSI_X3.4-1968"},
+ {20127, "ANSI_X3.4-1986"},
+ {20127, "ASCII"},
+ {20127, "CP367"},
+ {20127, "IBM367"},
+ {20127, "ISO-IR-6"},
+ {20127, "ISO646-US"},
+ {20127, "ISO_646.IRV:1991"},
+ {20127, "US"},
+ {20127, "US-ASCII"},
+ {20127, "CSASCII"},
+
+ /* !IsValidCodePage(819) */
+ {1252, "CP819"},
+ {1252, "IBM819"},
+ {28591, "ISO-8859-1"},
+ {28591, "ISO-IR-100"},
+ {28591, "ISO8859-1"},
+ {28591, "ISO_8859-1"},
+ {28591, "ISO_8859-1:1987"},
+ {28591, "L1"},
+ {28591, "LATIN1"},
+ {28591, "CSISOLATIN1"},
+
+ {1250, "CP1250"},
+ {1250, "MS-EE"},
+ {1250, "WINDOWS-1250"},
+
+ {1251, "CP1251"},
+ {1251, "MS-CYRL"},
+ {1251, "WINDOWS-1251"},
+
+ {1252, "CP1252"},
+ {1252, "MS-ANSI"},
+ {1252, "WINDOWS-1252"},
+
+ {1253, "CP1253"},
+ {1253, "MS-GREEK"},
+ {1253, "WINDOWS-1253"},
+
+ {1254, "CP1254"},
+ {1254, "MS-TURK"},
+ {1254, "WINDOWS-1254"},
+
+ {1255, "CP1255"},
+ {1255, "MS-HEBR"},
+ {1255, "WINDOWS-1255"},
+
+ {1256, "CP1256"},
+ {1256, "MS-ARAB"},
+ {1256, "WINDOWS-1256"},
+
+ {1257, "CP1257"},
+ {1257, "WINBALTRIM"},
+ {1257, "WINDOWS-1257"},
+
+ {1258, "CP1258"},
+ {1258, "WINDOWS-1258"},
+
+ {850, "850"},
+ {850, "CP850"},
+ {850, "IBM850"},
+ {850, "CSPC850MULTILINGUAL"},
+
+ /* !IsValidCodePage(862) */
+ {862, "862"},
+ {862, "CP862"},
+ {862, "IBM862"},
+ {862, "CSPC862LATINHEBREW"},
+
+ {866, "866"},
+ {866, "CP866"},
+ {866, "IBM866"},
+ {866, "CSIBM866"},
+
+ /* !IsValidCodePage(154) */
+ {154, "CP154"},
+ {154, "CYRILLIC-ASIAN"},
+ {154, "PT154"},
+ {154, "PTCP154"},
+ {154, "CSPTCP154"},
+
+ /* !IsValidCodePage(1133) */
+ {1133, "CP1133"},
+ {1133, "IBM-CP1133"},
+
+ {874, "CP874"},
+ {874, "WINDOWS-874"},
+
+ /* !IsValidCodePage(51932) */
+ {51932, "CP51932"},
+ {51932, "MS51932"},
+ {51932, "WINDOWS-51932"},
+ {51932, "EUC-JP"},
+
+ {932, "CP932"},
+ {932, "MS932"},
+ {932, "SHIFFT_JIS"},
+ {932, "SHIFFT_JIS-MS"},
+ {932, "SJIS"},
+ {932, "SJIS-MS"},
+ {932, "SJIS-OPEN"},
+ {932, "SJIS-WIN"},
+ {932, "WINDOWS-31J"},
+ {932, "WINDOWS-932"},
+ {932, "CSWINDOWS31J"},
+
+ {50221, "CP50221"},
+ {50221, "ISO-2022-JP"},
+ {50221, "ISO-2022-JP-MS"},
+ {50221, "ISO2022-JP"},
+ {50221, "ISO2022-JP-MS"},
+ {50221, "MS50221"},
+ {50221, "WINDOWS-50221"},
+
+ {936, "CP936"},
+ {936, "GBK"},
+ {936, "MS936"},
+ {936, "WINDOWS-936"},
+
+ {950, "CP950"},
+ {950, "BIG5"},
+ {950, "BIG5HKSCS"},
+ {950, "BIG5-HKSCS"},
+
+ {949, "CP949"},
+ {949, "UHC"},
+ {949, "EUC-KR"},
+
+ {1361, "CP1361"},
+ {1361, "JOHAB"},
+
+ {437, "437"},
+ {437, "CP437"},
+ {437, "IBM437"},
+ {437, "CSPC8CODEPAGE437"},
+
+ {737, "CP737"},
+
+ {775, "CP775"},
+ {775, "IBM775"},
+ {775, "CSPC775BALTIC"},
+
+ {852, "852"},
+ {852, "CP852"},
+ {852, "IBM852"},
+ {852, "CSPCP852"},
+
+ /* !IsValidCodePage(853) */
+ {853, "CP853"},
+
+ {855, "855"},
+ {855, "CP855"},
+ {855, "IBM855"},
+ {855, "CSIBM855"},
+
+ {857, "857"},
+ {857, "CP857"},
+ {857, "IBM857"},
+ {857, "CSIBM857"},
+
+ /* !IsValidCodePage(858) */
+ {858, "CP858"},
+
+ {860, "860"},
+ {860, "CP860"},
+ {860, "IBM860"},
+ {860, "CSIBM860"},
+
+ {861, "861"},
+ {861, "CP-IS"},
+ {861, "CP861"},
+ {861, "IBM861"},
+ {861, "CSIBM861"},
+
+ {863, "863"},
+ {863, "CP863"},
+ {863, "IBM863"},
+ {863, "CSIBM863"},
+
+ {864, "CP864"},
+ {864, "IBM864"},
+ {864, "CSIBM864"},
+
+ {865, "865"},
+ {865, "CP865"},
+ {865, "IBM865"},
+ {865, "CSIBM865"},
+
+ {869, "869"},
+ {869, "CP-GR"},
+ {869, "CP869"},
+ {869, "IBM869"},
+ {869, "CSIBM869"},
+
+ /* !IsValidCodePage(1152) */
+ {1125, "CP1125"},
+
+ /*
+ * Code Page Identifiers
+ * https://msdn.microsoft.com/en-us/library/dd317756.aspx
+ */
+ {37, "IBM037"}, /* IBM EBCDIC US-Canada */
+ {437, "IBM437"}, /* OEM United States */
+ {500, "IBM500"}, /* IBM EBCDIC International */
+ {708, "ASMO-708"}, /* Arabic (ASMO 708) */
+ /* 709 Arabic (ASMO-449+, BCON V4) */
+ /* 710 Arabic - Transparent Arabic */
+ {720, "DOS-720"}, /* Arabic (Transparent ASMO); Arabic (DOS) */
+ {737, "ibm737"}, /* OEM Greek (formerly 437G); Greek (DOS) */
+ {775, "ibm775"}, /* OEM Baltic; Baltic (DOS) */
+ {850, "ibm850"}, /* OEM Multilingual Latin 1; Western European (DOS) */
+ {852, "ibm852"}, /* OEM Latin 2; Central European (DOS) */
+ {855, "IBM855"}, /* OEM Cyrillic (primarily Russian) */
+ {857, "ibm857"}, /* OEM Turkish; Turkish (DOS) */
+ {858, "IBM00858"}, /* OEM Multilingual Latin 1 + Euro symbol */
+ {860, "IBM860"}, /* OEM Portuguese; Portuguese (DOS) */
+ {861, "ibm861"}, /* OEM Icelandic; Icelandic (DOS) */
+ {862, "DOS-862"}, /* OEM Hebrew; Hebrew (DOS) */
+ {863, "IBM863"}, /* OEM French Canadian; French Canadian (DOS) */
+ {864, "IBM864"}, /* OEM Arabic; Arabic (864) */
+ {865, "IBM865"}, /* OEM Nordic; Nordic (DOS) */
+ {866, "cp866"}, /* OEM Russian; Cyrillic (DOS) */
+ {869, "ibm869"}, /* OEM Modern Greek; Greek, Modern (DOS) */
+ {870, "IBM870"}, /* IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2 */
+ {874, "windows-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */
+ {875, "cp875"}, /* IBM EBCDIC Greek Modern */
+ {932, "shift_jis"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */
+ {932, "shift-jis"}, /* alternative name for it */
+ {936, "gb2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */
+ {949, "ks_c_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */
+ {950, "big5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */
+ {950, "big5hkscs"}, /* ANSI/OEM Traditional Chinese (Hong Kong SAR); Chinese Traditional (Big5-HKSCS) */
+ {950, "big5-hkscs"}, /* alternative name for it */
+ {1026, "IBM1026"}, /* IBM EBCDIC Turkish (Latin 5) */
+ {1047, "IBM01047"}, /* IBM EBCDIC Latin 1/Open System */
+ {1140, "IBM01140"}, /* IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro) */
+ {1141, "IBM01141"}, /* IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro) */
+ {1142, "IBM01142"}, /* IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro) */
+ {1143, "IBM01143"}, /* IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro) */
+ {1144, "IBM01144"}, /* IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro) */
+ {1145, "IBM01145"}, /* IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro) */
+ {1146, "IBM01146"}, /* IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro) */
+ {1147, "IBM01147"}, /* IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro) */
+ {1148, "IBM01148"}, /* IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro) */
+ {1149, "IBM01149"}, /* IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro) */
+ {1250, "windows-1250"}, /* ANSI Central European; Central European (Windows) */
+ {1251, "windows-1251"}, /* ANSI Cyrillic; Cyrillic (Windows) */
+ {1252, "windows-1252"}, /* ANSI Latin 1; Western European (Windows) */
+ {1253, "windows-1253"}, /* ANSI Greek; Greek (Windows) */
+ {1254, "windows-1254"}, /* ANSI Turkish; Turkish (Windows) */
+ {1255, "windows-1255"}, /* ANSI Hebrew; Hebrew (Windows) */
+ {1256, "windows-1256"}, /* ANSI Arabic; Arabic (Windows) */
+ {1257, "windows-1257"}, /* ANSI Baltic; Baltic (Windows) */
+ {1258, "windows-1258"}, /* ANSI/OEM Vietnamese; Vietnamese (Windows) */
+ {1361, "Johab"}, /* Korean (Johab) */
+ {10000, "macintosh"}, /* MAC Roman; Western European (Mac) */
+ {10001, "x-mac-japanese"}, /* Japanese (Mac) */
+ {10002, "x-mac-chinesetrad"}, /* MAC Traditional Chinese (Big5); Chinese Traditional (Mac) */
+ {10003, "x-mac-korean"}, /* Korean (Mac) */
+ {10004, "x-mac-arabic"}, /* Arabic (Mac) */
+ {10005, "x-mac-hebrew"}, /* Hebrew (Mac) */
+ {10006, "x-mac-greek"}, /* Greek (Mac) */
+ {10007, "x-mac-cyrillic"}, /* Cyrillic (Mac) */
+ {10008, "x-mac-chinesesimp"}, /* MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac) */
+ {10010, "x-mac-romanian"}, /* Romanian (Mac) */
+ {10017, "x-mac-ukrainian"}, /* Ukrainian (Mac) */
+ {10021, "x-mac-thai"}, /* Thai (Mac) */
+ {10029, "x-mac-ce"}, /* MAC Latin 2; Central European (Mac) */
+ {10079, "x-mac-icelandic"}, /* Icelandic (Mac) */
+ {10081, "x-mac-turkish"}, /* Turkish (Mac) */
+ {10082, "x-mac-croatian"}, /* Croatian (Mac) */
+ {20000, "x-Chinese_CNS"}, /* CNS Taiwan; Chinese Traditional (CNS) */
+ {20001, "x-cp20001"}, /* TCA Taiwan */
+ {20002, "x_Chinese-Eten"}, /* Eten Taiwan; Chinese Traditional (Eten) */
+ {20003, "x-cp20003"}, /* IBM5550 Taiwan */
+ {20004, "x-cp20004"}, /* TeleText Taiwan */
+ {20005, "x-cp20005"}, /* Wang Taiwan */
+ {20105, "x-IA5"}, /* IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5) */
+ {20106, "x-IA5-German"}, /* IA5 German (7-bit) */
+ {20107, "x-IA5-Swedish"}, /* IA5 Swedish (7-bit) */
+ {20108, "x-IA5-Norwegian"}, /* IA5 Norwegian (7-bit) */
+ {20127, "us-ascii"}, /* US-ASCII (7-bit) */
+ {20261, "x-cp20261"}, /* T.61 */
+ {20269, "x-cp20269"}, /* ISO 6937 Non-Spacing Accent */
+ {20273, "IBM273"}, /* IBM EBCDIC Germany */
+ {20277, "IBM277"}, /* IBM EBCDIC Denmark-Norway */
+ {20278, "IBM278"}, /* IBM EBCDIC Finland-Sweden */
+ {20280, "IBM280"}, /* IBM EBCDIC Italy */
+ {20284, "IBM284"}, /* IBM EBCDIC Latin America-Spain */
+ {20285, "IBM285"}, /* IBM EBCDIC United Kingdom */
+ {20290, "IBM290"}, /* IBM EBCDIC Japanese Katakana Extended */
+ {20297, "IBM297"}, /* IBM EBCDIC France */
+ {20420, "IBM420"}, /* IBM EBCDIC Arabic */
+ {20423, "IBM423"}, /* IBM EBCDIC Greek */
+ {20424, "IBM424"}, /* IBM EBCDIC Hebrew */
+ {20833, "x-EBCDIC-KoreanExtended"}, /* IBM EBCDIC Korean Extended */
+ {20838, "IBM-Thai"}, /* IBM EBCDIC Thai */
+ {20866, "koi8-r"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */
+ {20871, "IBM871"}, /* IBM EBCDIC Icelandic */
+ {20880, "IBM880"}, /* IBM EBCDIC Cyrillic Russian */
+ {20905, "IBM905"}, /* IBM EBCDIC Turkish */
+ {20924, "IBM00924"}, /* IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) */
+ {20932, "EUC-JP"}, /* Japanese (JIS 0208-1990 and 0121-1990) */
+ {20936, "x-cp20936"}, /* Simplified Chinese (GB2312); Chinese Simplified (GB2312-80) */
+ {20949, "x-cp20949"}, /* Korean Wansung */
+ {21025, "cp1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */
+ /* 21027 (deprecated) */
+ {21866, "koi8-u"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */
+ {28591, "iso-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
+ {28591, "iso8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */
+ {28591, "iso_8859-1"},
+ {28591, "iso_8859_1"},
+ {28592, "iso-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
+ {28592, "iso8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */
+ {28592, "iso_8859-2"},
+ {28592, "iso_8859_2"},
+ {28593, "iso-8859-3"}, /* ISO 8859-3 Latin 3 */
+ {28593, "iso8859-3"}, /* ISO 8859-3 Latin 3 */
+ {28593, "iso_8859-3"},
+ {28593, "iso_8859_3"},
+ {28594, "iso-8859-4"}, /* ISO 8859-4 Baltic */
+ {28594, "iso8859-4"}, /* ISO 8859-4 Baltic */
+ {28594, "iso_8859-4"},
+ {28594, "iso_8859_4"},
+ {28595, "iso-8859-5"}, /* ISO 8859-5 Cyrillic */
+ {28595, "iso8859-5"}, /* ISO 8859-5 Cyrillic */
+ {28595, "iso_8859-5"},
+ {28595, "iso_8859_5"},
+ {28596, "iso-8859-6"}, /* ISO 8859-6 Arabic */
+ {28596, "iso8859-6"}, /* ISO 8859-6 Arabic */
+ {28596, "iso_8859-6"},
+ {28596, "iso_8859_6"},
+ {28597, "iso-8859-7"}, /* ISO 8859-7 Greek */
+ {28597, "iso8859-7"}, /* ISO 8859-7 Greek */
+ {28597, "iso_8859-7"},
+ {28597, "iso_8859_7"},
+ {28598, "iso-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
+ {28598, "iso8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */
+ {28598, "iso_8859-8"},
+ {28598, "iso_8859_8"},
+ {28599, "iso-8859-9"}, /* ISO 8859-9 Turkish */
+ {28599, "iso8859-9"}, /* ISO 8859-9 Turkish */
+ {28599, "iso_8859-9"},
+ {28599, "iso_8859_9"},
+ {28603, "iso-8859-13"}, /* ISO 8859-13 Estonian */
+ {28603, "iso8859-13"}, /* ISO 8859-13 Estonian */
+ {28603, "iso_8859-13"},
+ {28603, "iso_8859_13"},
+ {28605, "iso-8859-15"}, /* ISO 8859-15 Latin 9 */
+ {28605, "iso8859-15"}, /* ISO 8859-15 Latin 9 */
+ {28605, "iso_8859-15"},
+ {28605, "iso_8859_15"},
+ {29001, "x-Europa"}, /* Europa 3 */
+ {38598, "iso-8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
+ {38598, "iso8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */
+ {38598, "iso_8859-8-i"},
+ {38598, "iso_8859_8-i"},
+ {50220, "iso-2022-jp"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */
+ {50221, "csISO2022JP"}, /* ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana) */
+ {50222, "iso-2022-jp"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */
+ {50225, "iso-2022-kr"}, /* ISO 2022 Korean */
+ {50225, "iso2022-kr"}, /* ISO 2022 Korean */
+ {50227, "x-cp50227"}, /* ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022) */
+ /* 50229 ISO 2022 Traditional Chinese */
+ /* 50930 EBCDIC Japanese (Katakana) Extended */
+ /* 50931 EBCDIC US-Canada and Japanese */
+ /* 50933 EBCDIC Korean Extended and Korean */
+ /* 50935 EBCDIC Simplified Chinese Extended and Simplified Chinese */
+ /* 50936 EBCDIC Simplified Chinese */
+ /* 50937 EBCDIC US-Canada and Traditional Chinese */
+ /* 50939 EBCDIC Japanese (Latin) Extended and Japanese */
+ {51932, "euc-jp"}, /* EUC Japanese */
+ {51936, "EUC-CN"}, /* EUC Simplified Chinese; Chinese Simplified (EUC) */
+ {51949, "euc-kr"}, /* EUC Korean */
+ /* 51950 EUC Traditional Chinese */
+ {52936, "hz-gb-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */
+ {54936, "GB18030"}, /* Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030) */
+ {57002, "x-iscii-de"}, /* ISCII Devanagari */
+ {57003, "x-iscii-be"}, /* ISCII Bengali */
+ {57004, "x-iscii-ta"}, /* ISCII Tamil */
+ {57005, "x-iscii-te"}, /* ISCII Telugu */
+ {57006, "x-iscii-as"}, /* ISCII Assamese */
+ {57007, "x-iscii-or"}, /* ISCII Oriya */
+ {57008, "x-iscii-ka"}, /* ISCII Kannada */
+ {57009, "x-iscii-ma"}, /* ISCII Malayalam */
+ {57010, "x-iscii-gu"}, /* ISCII Gujarati */
+ {57011, "x-iscii-pa"}, /* ISCII Punjabi */
+
+ {0, NULL}
+};
+
+/*
+ * SJIS SHIFTJIS table CP932 table
+ * ---- --------------------------- --------------------------------
+ * 5C U+00A5 YEN SIGN U+005C REVERSE SOLIDUS
+ * 7E U+203E OVERLINE U+007E TILDE
+ * 815C U+2014 EM DASH U+2015 HORIZONTAL BAR
+ * 815F U+005C REVERSE SOLIDUS U+FF3C FULLWIDTH REVERSE SOLIDUS
+ * 8160 U+301C WAVE DASH U+FF5E FULLWIDTH TILDE
+ * 8161 U+2016 DOUBLE VERTICAL LINE U+2225 PARALLEL TO
+ * 817C U+2212 MINUS SIGN U+FF0D FULLWIDTH HYPHEN-MINUS
+ * 8191 U+00A2 CENT SIGN U+FFE0 FULLWIDTH CENT SIGN
+ * 8192 U+00A3 POUND SIGN U+FFE1 FULLWIDTH POUND SIGN
+ * 81CA U+00AC NOT SIGN U+FFE2 FULLWIDTH NOT SIGN
+ *
+ * EUC-JP and ISO-2022-JP should be compatible with CP932.
+ *
+ * Kernel and MLang have different Unicode mapping table. Make sure
+ * which API is used.
+ */
+static compat_t cp932_compat[] = {
+ {0x00A5, 0x005C, COMPAT_OUT},
+ {0x203E, 0x007E, COMPAT_OUT},
+ {0x2014, 0x2015, COMPAT_OUT},
+ {0x301C, 0xFF5E, COMPAT_OUT},
+ {0x2016, 0x2225, COMPAT_OUT},
+ {0x2212, 0xFF0D, COMPAT_OUT},
+ {0x00A2, 0xFFE0, COMPAT_OUT},
+ {0x00A3, 0xFFE1, COMPAT_OUT},
+ {0x00AC, 0xFFE2, COMPAT_OUT},
+ {0, 0, 0}
+};
+
+static compat_t cp20932_compat[] = {
+ {0x00A5, 0x005C, COMPAT_OUT},
+ {0x203E, 0x007E, COMPAT_OUT},
+ {0x2014, 0x2015, COMPAT_OUT},
+ {0xFF5E, 0x301C, COMPAT_OUT|COMPAT_IN},
+ {0x2225, 0x2016, COMPAT_OUT|COMPAT_IN},
+ {0xFF0D, 0x2212, COMPAT_OUT|COMPAT_IN},
+ {0xFFE0, 0x00A2, COMPAT_OUT|COMPAT_IN},
+ {0xFFE1, 0x00A3, COMPAT_OUT|COMPAT_IN},
+ {0xFFE2, 0x00AC, COMPAT_OUT|COMPAT_IN},
+ {0, 0, 0}
+};
+
+static compat_t *cp51932_compat = cp932_compat;
+
+/* cp20932_compat for kernel. cp932_compat for mlang. */
+static compat_t *cp5022x_compat = cp932_compat;
+
+#if USE_MLANG_DLL
+typedef HRESULT (WINAPI *CONVERTINETSTRING)(
+ LPDWORD lpdwMode,
+ DWORD dwSrcEncoding,
+ DWORD dwDstEncoding,
+ LPCSTR lpSrcStr,
+ LPINT lpnSrcSize,
+ LPBYTE lpDstStr,
+ LPINT lpnDstSize
+);
+typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)(
+ LPDWORD lpdwMode,
+ DWORD dwSrcEncoding,
+ LPCSTR lpSrcStr,
+ LPINT lpnMultiCharCount,
+ LPWSTR lpDstStr,
+ LPINT lpnWideCharCount
+);
+typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)(
+ LPDWORD lpdwMode,
+ DWORD dwEncoding,
+ LPCWSTR lpSrcStr,
+ LPINT lpnWideCharCount,
+ LPSTR lpDstStr,
+ LPINT lpnMultiCharCount
+);
+typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)(
+ DWORD dwSrcEncoding,
+ DWORD dwDstEncoding
+);
+typedef HRESULT (WINAPI *LCIDTORFC1766A)(
+ LCID Locale,
+ LPSTR pszRfc1766,
+ int nChar
+);
+typedef HRESULT (WINAPI *LCIDTORFC1766W)(
+ LCID Locale,
+ LPWSTR pszRfc1766,
+ int nChar
+);
+typedef HRESULT (WINAPI *RFC1766TOLCIDA)(
+ LCID *pLocale,
+ LPSTR pszRfc1766
+);
+typedef HRESULT (WINAPI *RFC1766TOLCIDW)(
+ LCID *pLocale,
+ LPWSTR pszRfc1766
+);
+static CONVERTINETSTRING ConvertINetString;
+static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode;
+static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte;
+static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable;
+static LCIDTORFC1766A LcidToRfc1766A;
+static RFC1766TOLCIDA Rfc1766ToLcidA;
+#endif /*USE_MLANG_DLL*/
+
+#if USE_MLANG_DLL
+static int
+load_mlang(void)
+{
+ HMODULE h;
+ if (ConvertINetString != NULL)
+ return TRUE;
+ h = LoadLibrary(TEXT("mlang.dll"));
+ if (!h)
+ return FALSE;
+ ConvertINetString = (CONVERTINETSTRING)GetProcAddressA(h, "ConvertINetString");
+ ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddressA(h, "ConvertINetMultiByteToUnicode");
+ ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddressA(h, "ConvertINetUnicodeToMultiByte");
+ IsConvertINetStringAvailable = (ISCONVERTINETSTRINGAVAILABLE)GetProcAddressA(h, "IsConvertINetStringAvailable");
+ LcidToRfc1766A = (LCIDTORFC1766A)GetProcAddressA(h, "LcidToRfc1766A");
+ Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddressA(h, "Rfc1766ToLcidA");
+ return TRUE;
+}
+#endif
+
+
+static int
+win_iconv_open(gpgrt_w32_iconv_t cd, const char *tocode, const char *fromcode)
+{
+ if (!make_csconv(fromcode, &cd->from) || !make_csconv(tocode, &cd->to))
+ return FALSE;
+ cd->_errno = _errno;
+ return TRUE;
+}
+
+static size_t
+win_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ ushort wbuf[MB_CHAR_MAX]; /* enough room for one character */
+ int insize;
+ int outsize;
+ int wsize;
+ DWORD frommode;
+ DWORD tomode;
+ uint wc;
+ compat_t *cp;
+ int i;
+
+ if (inbuf == NULL || *inbuf == NULL)
+ {
+ if (outbuf != NULL && *outbuf != NULL && cd->to.flush != NULL)
+ {
+ tomode = cd->to.mode;
+ outsize = cd->to.flush(&cd->to, (uchar *)*outbuf, *outbytesleft);
+ if (outsize == -1)
+ {
+ if ((cd->to.flags & FLAG_IGNORE) && errno != E2BIG)
+ {
+ outsize = 0;
+ }
+ else
+ {
+ cd->to.mode = tomode;
+ return (size_t)(-1);
+ }
+ }
+ *outbuf += outsize;
+ *outbytesleft -= outsize;
+ }
+ cd->from.mode = 0;
+ cd->to.mode = 0;
+ return 0;
+ }
+
+ while (*inbytesleft != 0)
+ {
+ frommode = cd->from.mode;
+ tomode = cd->to.mode;
+ wsize = MB_CHAR_MAX;
+
+ insize = cd->from.mbtowc(&cd->from, (const uchar *)*inbuf, *inbytesleft, wbuf, &wsize);
+ if (insize == -1)
+ {
+ if (cd->to.flags & FLAG_IGNORE)
+ {
+ cd->from.mode = frommode;
+ insize = 1;
+ wsize = 0;
+ }
+ else
+ {
+ cd->from.mode = frommode;
+ return (size_t)(-1);
+ }
+ }
+
+ if (wsize == 0)
+ {
+ *inbuf += insize;
+ *inbytesleft -= insize;
+ continue;
+ }
+
+ if (cd->from.compat != NULL)
+ {
+ wc = utf16_to_ucs4(wbuf);
+ cp = cd->from.compat;
+ for (i = 0; cp[i].in != 0; ++i)
+ {
+ if ((cp[i].flag & COMPAT_IN) && cp[i].out == wc)
+ {
+ ucs4_to_utf16(cp[i].in, wbuf, &wsize);
+ break;
+ }
+ }
+ }
+
+ if (cd->to.compat != NULL)
+ {
+ wc = utf16_to_ucs4(wbuf);
+ cp = cd->to.compat;
+ for (i = 0; cp[i].in != 0; ++i)
+ {
+ if ((cp[i].flag & COMPAT_OUT) && cp[i].in == wc)
+ {
+ ucs4_to_utf16(cp[i].out, wbuf, &wsize);
+ break;
+ }
+ }
+ }
+
+ outsize = cd->to.wctomb(&cd->to, wbuf, wsize, (uchar *)*outbuf, *outbytesleft);
+ if (outsize == -1)
+ {
+ if ((cd->to.flags & FLAG_IGNORE) && errno != E2BIG)
+ {
+ cd->to.mode = tomode;
+ outsize = 0;
+ }
+ else
+ {
+ cd->from.mode = frommode;
+ cd->to.mode = tomode;
+ return (size_t)(-1);
+ }
+ }
+
+ *inbuf += insize;
+ *outbuf += outsize;
+ *inbytesleft -= insize;
+ *outbytesleft -= outsize;
+ }
+
+ return 0;
+}
+
+static int
+make_csconv(const char *_name, csconv_t *cv)
+{
+ CPINFO cpinfo;
+ int use_compat = TRUE;
+ int flag = 0;
+ char *name;
+ char *p;
+
+ name = xstrndup(_name, strlen(_name));
+ if (name == NULL)
+ return FALSE;
+
+ /* check for option "enc_name//opt1//opt2" */
+ while ((p = strrstr(name, "//")) != NULL)
+ {
+ if (_stricmp(p + 2, "nocompat") == 0)
+ use_compat = FALSE;
+ else if (_stricmp(p + 2, "translit") == 0)
+ flag |= FLAG_TRANSLIT;
+ else if (_stricmp(p + 2, "ignore") == 0)
+ flag |= FLAG_IGNORE;
+ *p = 0;
+ }
+
+ cv->mode = 0;
+ cv->flags = flag;
+ cv->mblen = NULL;
+ cv->flush = NULL;
+ cv->compat = NULL;
+ cv->codepage = name_to_codepage(name);
+ if (cv->codepage == 1200 || cv->codepage == 1201)
+ {
+ cv->mbtowc = utf16_mbtowc;
+ cv->wctomb = utf16_wctomb;
+ if (_stricmp(name, "UTF-16") == 0 || _stricmp(name, "UTF16") == 0 ||
+ _stricmp(name, "UCS-2") == 0 || _stricmp(name, "UCS2") == 0 ||
+ _stricmp(name,"UCS-2-INTERNAL") == 0)
+ cv->flags |= FLAG_USE_BOM;
+ }
+ else if (cv->codepage == 12000 || cv->codepage == 12001)
+ {
+ cv->mbtowc = utf32_mbtowc;
+ cv->wctomb = utf32_wctomb;
+ if (_stricmp(name, "UTF-32") == 0 || _stricmp(name, "UTF32") == 0 ||
+ _stricmp(name, "UCS-4") == 0 || _stricmp(name, "UCS4") == 0)
+ cv->flags |= FLAG_USE_BOM;
+ }
+ else if (cv->codepage == 65001)
+ {
+ cv->mbtowc = kernel_mbtowc;
+ cv->wctomb = kernel_wctomb;
+ cv->mblen = utf8_mblen;
+ }
+#if USE_MLANG_DLL
+ else if ((cv->codepage == 50220 || cv->codepage == 50221 || cv->codepage == 50222) && load_mlang())
+ {
+ cv->mbtowc = iso2022jp_mbtowc;
+ cv->wctomb = iso2022jp_wctomb;
+ cv->flush = iso2022jp_flush;
+ }
+ else if (cv->codepage == 51932 && load_mlang())
+ {
+ cv->mbtowc = mlang_mbtowc;
+ cv->wctomb = mlang_wctomb;
+ cv->mblen = eucjp_mblen;
+ }
+#endif /*USE_MLANG_DLL*/
+ else if (IsValidCodePage(cv->codepage)
+ && GetCPInfo(cv->codepage, &cpinfo) != 0)
+ {
+ cv->mbtowc = kernel_mbtowc;
+ cv->wctomb = kernel_wctomb;
+ if (cpinfo.MaxCharSize == 1)
+ cv->mblen = sbcs_mblen;
+ else if (cpinfo.MaxCharSize == 2)
+ cv->mblen = dbcs_mblen;
+ else
+ cv->mblen = mbcs_mblen;
+ }
+ else
+ {
+ /* not supported */
+ free(name);
+ errno = EINVAL;
+ return FALSE;
+ }
+
+ if (use_compat)
+ {
+ switch (cv->codepage)
+ {
+ case 932: cv->compat = cp932_compat; break;
+ case 20932: cv->compat = cp20932_compat; break;
+ case 51932: cv->compat = cp51932_compat; break;
+ case 50220: case 50221: case 50222: cv->compat = cp5022x_compat; break;
+ }
+ }
+
+ free(name);
+
+ return TRUE;
+}
+
+static int
+name_to_codepage(const char *name)
+{
+ int i;
+
+ if (*name == '\0' ||
+ strcmp(name, "char") == 0)
+ return GetACP();
+ else if (strcmp(name, "wchar_t") == 0)
+ return 1200;
+ else if (_strnicmp(name, "cp", 2) == 0)
+ return atoi(name + 2); /* CP123 */
+ else if ('0' <= name[0] && name[0] <= '9')
+ return atoi(name); /* 123 */
+ else if (_strnicmp(name, "xx", 2) == 0)
+ return atoi(name + 2); /* XX123 for debug */
+
+ for (i = 0; codepage_alias[i].name != NULL; ++i)
+ if (_stricmp(name, codepage_alias[i].name) == 0)
+ return codepage_alias[i].codepage;
+ return -1;
+}
+
+/*
+ * https://tools.ietf.org/html/rfc2781
+ */
+static uint
+utf16_to_ucs4(const ushort *wbuf)
+{
+ uint wc = wbuf[0];
+ if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF)
+ wc = ((wbuf[0] & 0x3FF) << 10) + (wbuf[1] & 0x3FF) + 0x10000;
+ return wc;
+}
+
+static void
+ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize)
+{
+ if (wc < 0x10000)
+ {
+ wbuf[0] = wc;
+ *wbufsize = 1;
+ }
+ else
+ {
+ wc -= 0x10000;
+ wbuf[0] = 0xD800 | ((wc >> 10) & 0x3FF);
+ wbuf[1] = 0xDC00 | (wc & 0x3FF);
+ *wbufsize = 2;
+ }
+}
+
+/*
+ * Check if codepage is one of those for which the dwFlags parameter
+ * to MultiByteToWideChar() must be zero. Return zero or
+ * MB_ERR_INVALID_CHARS. The docs in Platform SDK for Windows
+ * Server 2003 R2 claims that also codepage 65001 is one of these, but
+ * that doesn't seem to be the case. The MSDN docs for MSVS2008 leave
+ * out 65001 (UTF-8), and that indeed seems to be the case on XP, it
+ * works fine to pass MB_ERR_INVALID_CHARS in dwFlags when converting
+ * from UTF-8.
+ */
+static int
+mbtowc_flags(int codepage)
+{
+ return (codepage == 50220 || codepage == 50221 ||
+ codepage == 50222 || codepage == 50225 ||
+ codepage == 50227 || codepage == 50229 ||
+ codepage == 52936 || codepage == 54936 ||
+ (codepage >= 57002 && codepage <= 57011) ||
+ codepage == 65000 || codepage == 42) ? 0 : MB_ERR_INVALID_CHARS;
+}
+
+/*
+ * Check if codepage is one those for which the lpUsedDefaultChar
+ * parameter to WideCharToMultiByte() must be NULL. The docs in
+ * Platform SDK for Windows Server 2003 R2 claims that this is the
+ * list below, while the MSDN docs for MSVS2008 claim that it is only
+ * for 65000 (UTF-7) and 65001 (UTF-8). This time the earlier Platform
+ * SDK seems to be correct, at least for XP.
+ */
+static int
+must_use_null_useddefaultchar(int codepage)
+{
+ return (codepage == 65000 || codepage == 65001 ||
+ codepage == 50220 || codepage == 50221 ||
+ codepage == 50222 || codepage == 50225 ||
+ codepage == 50227 || codepage == 50229 ||
+ codepage == 52936 || codepage == 54936 ||
+ (codepage >= 57002 && codepage <= 57011) ||
+ codepage == 42);
+}
+
+static char *
+strrstr(const char *str, const char *token)
+{
+ int len = strlen(token);
+ const char *p = str + strlen(str);
+
+ while (str <= --p)
+ if (p[0] == token[0] && strncmp(p, token, len) == 0)
+ return (char *)p;
+ return NULL;
+}
+
+static char *
+xstrndup(const char *s, size_t n)
+{
+ char *p;
+
+ p = (char *)malloc(n + 1);
+ if (p == NULL)
+ return NULL;
+ memcpy(p, s, n);
+ p[n] = '\0';
+ return p;
+}
+
+static int
+seterror(int err)
+{
+ _gpg_err_set_errno (err);
+ return -1;
+}
+
+
+static int
+sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize)
+{
+ (void)cv;
+ (void)buf;
+ (void)bufsize;
+ return 1;
+}
+
+static int
+dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize)
+{
+ int len = IsDBCSLeadByteEx(cv->codepage, buf[0]) ? 2 : 1;
+ if (bufsize < len)
+ return seterror(EINVAL);
+ return len;
+}
+
+static int
+mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize)
+{
+ int len = 0;
+
+ if (cv->codepage == 54936) {
+ if (buf[0] <= 0x7F) len = 1;
+ else if (buf[0] >= 0x81 && buf[0] <= 0xFE &&
+ bufsize >= 2 &&
+ ((buf[1] >= 0x40 && buf[1] <= 0x7E) ||
+ (buf[1] >= 0x80 && buf[1] <= 0xFE))) len = 2;
+ else if (buf[0] >= 0x81 && buf[0] <= 0xFE &&
+ bufsize >= 4 &&
+ buf[1] >= 0x30 && buf[1] <= 0x39) len = 4;
+ else
+ return seterror(EINVAL);
+ return len;
+ }
+ else
+ return seterror(EINVAL);
+}
+
+static int
+utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize)
+{
+ int len = 0;
+
+ (void) cv;
+
+ if (buf[0] < 0x80) len = 1;
+ else if ((buf[0] & 0xE0) == 0xC0) len = 2;
+ else if ((buf[0] & 0xF0) == 0xE0) len = 3;
+ else if ((buf[0] & 0xF8) == 0xF0) len = 4;
+ else if ((buf[0] & 0xFC) == 0xF8) len = 5;
+ else if ((buf[0] & 0xFE) == 0xFC) len = 6;
+
+ if (len == 0)
+ return seterror(EILSEQ);
+ else if (bufsize < len)
+ return seterror(EINVAL);
+ return len;
+}
+
+#if USE_MLANG_DLL
+static int
+eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize)
+{
+ (void) cv;
+
+ if (buf[0] < 0x80) /* ASCII */
+ return 1;
+ else if (buf[0] == 0x8E) /* JIS X 0201 */
+ {
+ if (bufsize < 2)
+ return seterror(EINVAL);
+ else if (!(0xA1 <= buf[1] && buf[1] <= 0xDF))
+ return seterror(EILSEQ);
+ return 2;
+ }
+ else if (buf[0] == 0x8F) /* JIS X 0212 */
+ {
+ if (bufsize < 3)
+ return seterror(EINVAL);
+ else if (!(0xA1 <= buf[1] && buf[1] <= 0xFE)
+ || !(0xA1 <= buf[2] && buf[2] <= 0xFE))
+ return seterror(EILSEQ);
+ return 3;
+ }
+ else /* JIS X 0208 */
+ {
+ if (bufsize < 2)
+ return seterror(EINVAL);
+ else if (!(0xA1 <= buf[0] && buf[0] <= 0xFE)
+ || !(0xA1 <= buf[1] && buf[1] <= 0xFE))
+ return seterror(EILSEQ);
+ return 2;
+ }
+}
+#endif /*USE_MLANG_DLL*/
+
+static int
+kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
+{
+ int len;
+
+ len = cv->mblen(cv, buf, bufsize);
+ if (len == -1)
+ return -1;
+ /* If converting from ASCII, reject 8bit
+ * chars. MultiByteToWideChar() doesn't. Note that for ASCII we
+ * know that the mblen function is sbcs_mblen() so len is 1.
+ */
+ if (cv->codepage == 20127 && buf[0] >= 0x80)
+ return seterror(EILSEQ);
+ *wbufsize = MultiByteToWideChar(cv->codepage, mbtowc_flags (cv->codepage),
+ (const char *)buf, len, (wchar_t *)wbuf, *wbufsize);
+ if (*wbufsize == 0)
+ return seterror(EILSEQ);
+ return len;
+}
+
+static int
+kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
+{
+ BOOL usedDefaultChar = 0;
+ BOOL *p = NULL;
+ int flags = 0;
+ int len;
+
+ if (bufsize == 0)
+ return seterror(E2BIG);
+ if (!must_use_null_useddefaultchar(cv->codepage))
+ {
+ p = &usedDefaultChar;
+#ifdef WC_NO_BEST_FIT_CHARS
+ if (!(cv->flags & FLAG_TRANSLIT))
+ flags |= WC_NO_BEST_FIT_CHARS;
+#endif
+ }
+ len = WideCharToMultiByte(cv->codepage, flags,
+ (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL, p);
+ if (len == 0)
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ return seterror(E2BIG);
+ return seterror(EILSEQ);
+ }
+ else if (usedDefaultChar && !(cv->flags & FLAG_TRANSLIT))
+ return seterror(EILSEQ);
+ else if (cv->mblen(cv, buf, len) != len) /* validate result */
+ return seterror(EILSEQ);
+ return len;
+}
+
+/*
+ * It seems that the mode (cv->mode) is fixnum.
+ * For example, when converting iso-2022-jp(cp50221) to unicode:
+ * in ascii sequence: mode=0xC42C0000
+ * in jisx0208 sequence: mode=0xC42C0001
+ * "C42C" is same for each convert session.
+ * It should be: ((codepage-1)<<16)|state
+ */
+#if USE_MLANG_DLL
+static int
+mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
+{
+ int len;
+ int insize;
+ HRESULT hr;
+
+ len = cv->mblen(cv, buf, bufsize);
+ if (len == -1)
+ return -1;
+ insize = len;
+ hr = ConvertINetMultiByteToUnicode(&cv->mode, cv->codepage,
+ (const char *)buf, &insize, (wchar_t *)wbuf, wbufsize);
+ if (hr != S_OK || insize != len)
+ return seterror(EILSEQ);
+ return len;
+}
+
+static int
+mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
+{
+ char tmpbuf[MB_CHAR_MAX]; /* enough room for one character */
+ int tmpsize = MB_CHAR_MAX;
+ int insize = wbufsize;
+ HRESULT hr;
+
+ hr = ConvertINetUnicodeToMultiByte(&cv->mode, cv->codepage,
+ (const wchar_t *)wbuf, &wbufsize, tmpbuf, &tmpsize);
+ if (hr != S_OK || insize != wbufsize)
+ return seterror(EILSEQ);
+ else if (bufsize < tmpsize)
+ return seterror(E2BIG);
+ else if (cv->mblen(cv, (uchar *)tmpbuf, tmpsize) != tmpsize)
+ return seterror(EILSEQ);
+ memcpy(buf, tmpbuf, tmpsize);
+ return tmpsize;
+}
+#endif /*USE_MLANG_DLL*/
+
+static int
+utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
+{
+ int codepage = cv->codepage;
+
+ /* swap endian: 1200 <-> 1201 */
+ if (cv->mode & UNICODE_MODE_SWAPPED)
+ codepage ^= 1;
+
+ if (bufsize < 2)
+ return seterror(EINVAL);
+ if (codepage == 1200) /* little endian */
+ wbuf[0] = (buf[1] << 8) | buf[0];
+ else if (codepage == 1201) /* big endian */
+ wbuf[0] = (buf[0] << 8) | buf[1];
+
+ if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE))
+ {
+ cv->mode |= UNICODE_MODE_BOM_DONE;
+ if (wbuf[0] == 0xFFFE)
+ {
+ cv->mode |= UNICODE_MODE_SWAPPED;
+ *wbufsize = 0;
+ return 2;
+ }
+ else if (wbuf[0] == 0xFEFF)
+ {
+ *wbufsize = 0;
+ return 2;
+ }
+ }
+
+ if (0xDC00 <= wbuf[0] && wbuf[0] <= 0xDFFF)
+ return seterror(EILSEQ);
+ if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF)
+ {
+ if (bufsize < 4)
+ return seterror(EINVAL);
+ if (codepage == 1200) /* little endian */
+ wbuf[1] = (buf[3] << 8) | buf[2];
+ else if (codepage == 1201) /* big endian */
+ wbuf[1] = (buf[2] << 8) | buf[3];
+ if (!(0xDC00 <= wbuf[1] && wbuf[1] <= 0xDFFF))
+ return seterror(EILSEQ);
+ *wbufsize = 2;
+ return 4;
+ }
+ *wbufsize = 1;
+ return 2;
+}
+
+static int
+utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
+{
+ if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE))
+ {
+ int r;
+
+ cv->mode |= UNICODE_MODE_BOM_DONE;
+ if (bufsize < 2)
+ return seterror(E2BIG);
+ if (cv->codepage == 1200) /* little endian */
+ memcpy(buf, "\xFF\xFE", 2);
+ else if (cv->codepage == 1201) /* big endian */
+ memcpy(buf, "\xFE\xFF", 2);
+
+ r = utf16_wctomb(cv, wbuf, wbufsize, buf + 2, bufsize - 2);
+ if (r == -1)
+ return -1;
+ return r + 2;
+ }
+
+ if (bufsize < 2)
+ return seterror(E2BIG);
+ if (cv->codepage == 1200) /* little endian */
+ {
+ buf[0] = (wbuf[0] & 0x00FF);
+ buf[1] = (wbuf[0] & 0xFF00) >> 8;
+ }
+ else if (cv->codepage == 1201) /* big endian */
+ {
+ buf[0] = (wbuf[0] & 0xFF00) >> 8;
+ buf[1] = (wbuf[0] & 0x00FF);
+ }
+ if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF)
+ {
+ if (bufsize < 4)
+ return seterror(E2BIG);
+ if (cv->codepage == 1200) /* little endian */
+ {
+ buf[2] = (wbuf[1] & 0x00FF);
+ buf[3] = (wbuf[1] & 0xFF00) >> 8;
+ }
+ else if (cv->codepage == 1201) /* big endian */
+ {
+ buf[2] = (wbuf[1] & 0xFF00) >> 8;
+ buf[3] = (wbuf[1] & 0x00FF);
+ }
+ return 4;
+ }
+ return 2;
+}
+
+static int
+utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize)
+{
+ int codepage = cv->codepage;
+ uint wc = 0xD800;
+
+ /* swap endian: 12000 <-> 12001 */
+ if (cv->mode & UNICODE_MODE_SWAPPED)
+ codepage ^= 1;
+
+ if (bufsize < 4)
+ return seterror(EINVAL);
+ if (codepage == 12000) /* little endian */
+ wc = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+ else if (codepage == 12001) /* big endian */
+ wc = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
+
+ if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE))
+ {
+ cv->mode |= UNICODE_MODE_BOM_DONE;
+ if (wc == 0xFFFE0000)
+ {
+ cv->mode |= UNICODE_MODE_SWAPPED;
+ *wbufsize = 0;
+ return 4;
+ }
+ else if (wc == 0x0000FEFF)
+ {
+ *wbufsize = 0;
+ return 4;
+ }
+ }
+
+ if ((0xD800 <= wc && wc <= 0xDFFF) || 0x10FFFF < wc)
+ return seterror(EILSEQ);
+ ucs4_to_utf16(wc, wbuf, wbufsize);
+ return 4;
+}
+
+static int
+utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
+{
+ uint wc;
+
+ if ((cv->flags & FLAG_USE_BOM) && !(cv->mode & UNICODE_MODE_BOM_DONE))
+ {
+ int r;
+
+ cv->mode |= UNICODE_MODE_BOM_DONE;
+ if (bufsize < 4)
+ return seterror(E2BIG);
+ if (cv->codepage == 12000) /* little endian */
+ memcpy(buf, "\xFF\xFE\x00\x00", 4);
+ else if (cv->codepage == 12001) /* big endian */
+ memcpy(buf, "\x00\x00\xFE\xFF", 4);
+
+ r = utf32_wctomb(cv, wbuf, wbufsize, buf + 4, bufsize - 4);
+ if (r == -1)
+ return -1;
+ return r + 4;
+ }
+
+ if (bufsize < 4)
+ return seterror(E2BIG);
+ wc = utf16_to_ucs4(wbuf);
+ if (cv->codepage == 12000) /* little endian */
+ {
+ buf[0] = wc & 0x000000FF;
+ buf[1] = (wc & 0x0000FF00) >> 8;
+ buf[2] = (wc & 0x00FF0000) >> 16;
+ buf[3] = (wc & 0xFF000000) >> 24;
+ }
+ else if (cv->codepage == 12001) /* big endian */
+ {
+ buf[0] = (wc & 0xFF000000) >> 24;
+ buf[1] = (wc & 0x00FF0000) >> 16;
+ buf[2] = (wc & 0x0000FF00) >> 8;
+ buf[3] = wc & 0x000000FF;
+ }
+ return 4;
+}
+
+/*
+ * 50220: ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS)
+ * 50221: ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow
+ * 1 byte Kana)
+ * 50222: ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte
+ * Kana - SO/SI)
+ *
+ * MultiByteToWideChar() and WideCharToMultiByte() behave differently
+ * depending on Windows version. On XP, WideCharToMultiByte() doesn't
+ * terminate result sequence with ascii escape. But Vista does.
+ * Use MLang instead.
+ */
+
+#define ISO2022_MODE(cs, shift) (((cs) << 8) | (shift))
+#define ISO2022_MODE_CS(mode) (((mode) >> 8) & 0xFF)
+#define ISO2022_MODE_SHIFT(mode) ((mode) & 0xFF)
+
+#define ISO2022_SI 0
+#define ISO2022_SO 1
+
+/* shift in */
+static const char iso2022_SI_seq[] = "\x0F";
+/* shift out */
+static const char iso2022_SO_seq[] = "\x0E";
+
+typedef struct iso2022_esc_t iso2022_esc_t;
+struct iso2022_esc_t {
+ const char *esc;
+ int esc_len;
+ int len;
+ int cs;
+};
+
+#define ISO2022JP_CS_ASCII 0
+#define ISO2022JP_CS_JISX0201_ROMAN 1
+#define ISO2022JP_CS_JISX0201_KANA 2
+#define ISO2022JP_CS_JISX0208_1978 3
+#define ISO2022JP_CS_JISX0208_1983 4
+#define ISO2022JP_CS_JISX0212 5
+
+#if USE_MLANG_DLL
+static iso2022_esc_t iso2022jp_esc[] = {
+ {"\x1B\x28\x42", 3, 1, ISO2022JP_CS_ASCII},
+ {"\x1B\x28\x4A", 3, 1, ISO2022JP_CS_JISX0201_ROMAN},
+ {"\x1B\x28\x49", 3, 1, ISO2022JP_CS_JISX0201_KANA},
+ {"\x1B\x24\x40", 3, 2, ISO2022JP_CS_JISX0208_1983}, /* unify 1978 with 1983 */
+ {"\x1B\x24\x42", 3, 2, ISO2022JP_CS_JISX0208_1983},
+ {"\x1B\x24\x28\x44", 4, 2, ISO2022JP_CS_JISX0212},
+ {NULL, 0, 0, 0}
+};
+#endif /*USE_MLANG_DLL*/
+
+#if USE_MLANG_DLL
+static int
+iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize,
+ ushort *wbuf, int *wbufsize)
+{
+ iso2022_esc_t *iesc = iso2022jp_esc;
+ char tmp[MB_CHAR_MAX];
+ int insize;
+ HRESULT hr;
+ DWORD dummy = 0;
+ int len;
+ int esc_len;
+ int cs;
+ int shift;
+ int i;
+
+ if (buf[0] == 0x1B)
+ {
+ for (i = 0; iesc[i].esc != NULL; ++i)
+ {
+ esc_len = iesc[i].esc_len;
+ if (bufsize < esc_len)
+ {
+ if (strncmp((char *)buf, iesc[i].esc, bufsize) == 0)
+ return seterror(EINVAL);
+ }
+ else
+ {
+ if (strncmp((char *)buf, iesc[i].esc, esc_len) == 0)
+ {
+ cv->mode = ISO2022_MODE(iesc[i].cs, ISO2022_SI);
+ *wbufsize = 0;
+ return esc_len;
+ }
+ }
+ }
+ /* not supported escape sequence */
+ return seterror(EILSEQ);
+ }
+ else if (buf[0] == iso2022_SO_seq[0])
+ {
+ cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SO);
+ *wbufsize = 0;
+ return 1;
+ }
+ else if (buf[0] == iso2022_SI_seq[0])
+ {
+ cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SI);
+ *wbufsize = 0;
+ return 1;
+ }
+
+ cs = ISO2022_MODE_CS(cv->mode);
+ shift = ISO2022_MODE_SHIFT(cv->mode);
+
+ /* reset the mode for informal sequence */
+ if (buf[0] < 0x20)
+ {
+ cs = ISO2022JP_CS_ASCII;
+ shift = ISO2022_SI;
+ }
+
+ len = iesc[cs].len;
+ if (bufsize < len)
+ return seterror(EINVAL);
+ for (i = 0; i < len; ++i)
+ if (!(buf[i] < 0x80))
+ return seterror(EILSEQ);
+ esc_len = iesc[cs].esc_len;
+ memcpy(tmp, iesc[cs].esc, esc_len);
+ if (shift == ISO2022_SO)
+ {
+ memcpy(tmp + esc_len, iso2022_SO_seq, 1);
+ esc_len += 1;
+ }
+ memcpy(tmp + esc_len, buf, len);
+
+ if ((cv->codepage == 50220 || cv->codepage == 50221
+ || cv->codepage == 50222) && shift == ISO2022_SO)
+ {
+ /* XXX: shift-out cannot be used for mbtowc (both kernel and
+ * mlang) */
+ esc_len = iesc[ISO2022JP_CS_JISX0201_KANA].esc_len;
+ memcpy(tmp, iesc[ISO2022JP_CS_JISX0201_KANA].esc, esc_len);
+ memcpy(tmp + esc_len, buf, len);
+ }
+
+ insize = len + esc_len;
+ hr = ConvertINetMultiByteToUnicode(&dummy, cv->codepage,
+ (const char *)tmp, &insize, (wchar_t *)wbuf, wbufsize);
+ if (hr != S_OK || insize != len + esc_len)
+ return seterror(EILSEQ);
+
+ /* Check for conversion error. Assuming defaultChar is 0x3F. */
+ /* ascii should be converted from ascii */
+ if (wbuf[0] == buf[0]
+ && cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI))
+ return seterror(EILSEQ);
+
+ /* reset the mode for informal sequence */
+ if (cv->mode != ISO2022_MODE(cs, shift))
+ cv->mode = ISO2022_MODE(cs, shift);
+
+ return len;
+}
+#endif /*USE_MLANG_DLL*/
+
+
+#if USE_MLANG_DLL
+static int
+iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
+{
+ iso2022_esc_t *iesc = iso2022jp_esc;
+ char tmp[MB_CHAR_MAX];
+ int tmpsize = MB_CHAR_MAX;
+ int insize = wbufsize;
+ HRESULT hr;
+ DWORD dummy = 0;
+ int len;
+ int esc_len;
+ int cs;
+ int shift;
+ int i;
+
+ /*
+ * MultiByte = [escape sequence] + character + [escape sequence]
+ *
+ * Whether trailing escape sequence is added depends on which API is
+ * used (kernel or MLang, and its version).
+ */
+ hr = ConvertINetUnicodeToMultiByte(&dummy, cv->codepage,
+ (const wchar_t *)wbuf, &wbufsize, tmp, &tmpsize);
+ if (hr != S_OK || insize != wbufsize)
+ return seterror(EILSEQ);
+ else if (bufsize < tmpsize)
+ return seterror(E2BIG);
+
+ if (tmpsize == 1)
+ {
+ cs = ISO2022JP_CS_ASCII;
+ esc_len = 0;
+ }
+ else
+ {
+ for (i = 1; iesc[i].esc != NULL; ++i)
+ {
+ esc_len = iesc[i].esc_len;
+ if (strncmp(tmp, iesc[i].esc, esc_len) == 0)
+ {
+ cs = iesc[i].cs;
+ break;
+ }
+ }
+ if (iesc[i].esc == NULL)
+ /* not supported escape sequence */
+ return seterror(EILSEQ);
+ }
+
+ shift = ISO2022_SI;
+ if (tmp[esc_len] == iso2022_SO_seq[0])
+ {
+ shift = ISO2022_SO;
+ esc_len += 1;
+ }
+
+ len = iesc[cs].len;
+
+ /* Check for converting error. Assuming defaultChar is 0x3F. */
+ /* ascii should be converted from ascii */
+ if (cs == ISO2022JP_CS_ASCII && !(wbuf[0] < 0x80))
+ return seterror(EILSEQ);
+ else if (tmpsize < esc_len + len)
+ return seterror(EILSEQ);
+
+ if (cv->mode == ISO2022_MODE(cs, shift))
+ {
+ /* remove escape sequence */
+ if (esc_len != 0)
+ memmove(tmp, tmp + esc_len, len);
+ esc_len = 0;
+ }
+ else
+ {
+ if (cs == ISO2022JP_CS_ASCII)
+ {
+ esc_len = iesc[ISO2022JP_CS_ASCII].esc_len;
+ memmove(tmp + esc_len, tmp, len);
+ memcpy(tmp, iesc[ISO2022JP_CS_ASCII].esc, esc_len);
+ }
+ if (ISO2022_MODE_SHIFT(cv->mode) == ISO2022_SO)
+ {
+ /* shift-in before changing to other mode */
+ memmove(tmp + 1, tmp, len + esc_len);
+ memcpy(tmp, iso2022_SI_seq, 1);
+ esc_len += 1;
+ }
+ }
+
+ if (bufsize < len + esc_len)
+ return seterror(E2BIG);
+ memcpy(buf, tmp, len + esc_len);
+ cv->mode = ISO2022_MODE(cs, shift);
+ return len + esc_len;
+}
+#endif /*USE_MLANG_DLL*/
+
+#if USE_MLANG_DLL
+static int
+iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize)
+{
+ iso2022_esc_t *iesc = iso2022jp_esc;
+ int esc_len;
+
+ if (cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI))
+ {
+ esc_len = 0;
+ if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI)
+ esc_len += 1;
+ if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII)
+ esc_len += iesc[ISO2022JP_CS_ASCII].esc_len;
+ if (bufsize < esc_len)
+ return seterror(E2BIG);
+
+ esc_len = 0;
+ if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI)
+ {
+ memcpy(buf, iso2022_SI_seq, 1);
+ esc_len += 1;
+ }
+ if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII)
+ {
+ memcpy(buf + esc_len, iesc[ISO2022JP_CS_ASCII].esc,
+ iesc[ISO2022JP_CS_ASCII].esc_len);
+ esc_len += iesc[ISO2022JP_CS_ASCII].esc_len;
+ }
+ return esc_len;
+ }
+ return 0;
+}
+#endif /*USE_MLANG_DLL*/
+
+
+gpgrt_w32_iconv_t
+gpgrt_w32_iconv_open (const char *tocode, const char *fromcode)
+{
+ gpgrt_w32_iconv_t cd;
+
+ cd = calloc(1, sizeof *cd);
+ if (!cd)
+ return (gpgrt_w32_iconv_t)(-1);
+
+ /* reset the errno to prevent reporting wrong error code.
+ * 0 for unsorted error. */
+ _gpg_err_set_errno (0);
+ if (win_iconv_open(cd, tocode, fromcode))
+ return cd;
+
+ free(cd);
+
+ return (gpgrt_w32_iconv_t)(-1);
+}
+
+int
+gpgrt_w32_iconv_close (gpgrt_w32_iconv_t cd)
+{
+ if (cd)
+ {
+ free (cd);
+ }
+
+ return 0;
+}
+
+size_t
+gpgrt_w32_iconv (gpgrt_w32_iconv_t cd,
+ const char **inbuf, size_t *inbytesleft,
+ char **outbuf, size_t *outbytesleft)
+{
+ size_t r;
+
+ r = win_iconv (cd, inbuf, inbytesleft, outbuf, outbytesleft);
+ _gpg_err_set_errno (*(cd->_errno()));
+ return r;
+}
diff --git a/src/w32-lock-obj.h b/src/w32-lock-obj.h
index ef53546..8ed3084 100644
--- a/src/w32-lock-obj.h
+++ b/src/w32-lock-obj.h
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifndef W32_LOCK_OBJ_H
diff --git a/src/w32-lock.c b/src/w32-lock.c
index 56a0ed5..51b13a1 100644
--- a/src/w32-lock.c
+++ b/src/w32-lock.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -37,6 +37,26 @@
#include "w32-lock-obj.h"
+
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_lock_func)(void);
+static void (*post_lock_func)(void);
+
+
+/* Helper to set the clamp functions. This is called as a helper from
+ * _gpgrt_set_syscall_clamp to keep the function pointers local. */
+void
+_gpgrt_lock_set_lock_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_lock_func = pre;
+ post_lock_func = post;
+}
+
+
+
static _gpgrt_lock_t *
get_lock_object (gpgrt_lock_t *lockhd)
{
@@ -50,7 +70,7 @@ get_lock_object (gpgrt_lock_t *lockhd)
gpg_err_code_t
-gpgrt_lock_init (gpgrt_lock_t *lockhd)
+_gpgrt_lock_init (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = (_gpgrt_lock_t*)lockhd;
@@ -72,11 +92,12 @@ gpgrt_lock_init (gpgrt_lock_t *lockhd)
InitializeCriticalSection (&lock->csec);
lock->initdone = 1;
+ return 0;
}
gpg_err_code_t
-gpgrt_lock_lock (gpgrt_lock_t *lockhd)
+_gpgrt_lock_lock (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
@@ -100,13 +121,41 @@ gpgrt_lock_lock (gpgrt_lock_t *lockhd)
}
}
+ if (pre_lock_func)
+ pre_lock_func ();
EnterCriticalSection (&lock->csec);
+ if (post_lock_func)
+ post_lock_func ();
+ return 0;
+}
+
+
+gpg_err_code_t
+_gpgrt_lock_trylock (gpgrt_lock_t *lockhd)
+{
+ _gpgrt_lock_t *lock = get_lock_object (lockhd);
+
+ if (!lock->initdone)
+ {
+ if (!InterlockedIncrement (&lock->started))
+ {
+ gpgrt_lock_init (lockhd);
+ }
+ else
+ {
+ while (!lock->initdone)
+ Sleep (0);
+ }
+ }
+
+ if (!TryEnterCriticalSection (&lock->csec))
+ return GPG_ERR_EBUSY;
return 0;
}
gpg_err_code_t
-gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
+_gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
@@ -120,7 +169,7 @@ gpgrt_lock_unlock (gpgrt_lock_t *lockhd)
/* Note: Use this function only if no other thread holds or waits for
this lock. */
gpg_err_code_t
-gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
+_gpgrt_lock_destroy (gpgrt_lock_t *lockhd)
{
_gpgrt_lock_t *lock = get_lock_object (lockhd);
diff --git a/src/w32-thread.c b/src/w32-thread.c
index f86be35..aef421f 100644
--- a/src/w32-thread.c
+++ b/src/w32-thread.c
@@ -14,7 +14,7 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -35,10 +35,32 @@
#include "thread.h"
+/*
+ * Functions called before and after blocking syscalls.
+ * gpgrt_set_syscall_clamp is used to set them.
+ */
+static void (*pre_syscall_func)(void);
+static void (*post_syscall_func)(void);
+
+
+/* Helper to set the clamp functions. This is called as a helper from
+ * _gpgrt_set_syscall_clamp to keep the function pointers local. */
+void
+_gpgrt_thread_set_syscall_clamp (void (*pre)(void), void (*post)(void))
+{
+ pre_syscall_func = pre;
+ post_syscall_func = post;
+}
+
+
gpg_err_code_t
-gpgrt_yield (void)
+_gpgrt_yield (void)
{
+ if (pre_syscall_func)
+ pre_syscall_func ();
Sleep (0);
+ if (post_syscall_func)
+ post_syscall_func ();
return 0;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 277a78b..a3c6cbd 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -27,14 +27,15 @@ endif
gpg_error_lib = ../src/libgpg-error.la
-TESTS = t-version t-strerror t-syserror t-lock
-
-INCLUDES = -I$(top_builddir)/src $(extra_includes)
+TESTS = t-version t-strerror t-syserror t-lock t-printf t-poll t-b64dec
+AM_CPPFLAGS = -I$(top_builddir)/src $(extra_includes)
+AM_LDFLAGS = -no-install
LDADD = $(gpg_error_lib)
noinst_PROGRAMS = $(TESTS)
noinst_HEADERS = t-common.h
t_lock_LDADD = $(gpg_error_lib) $(LIBMULTITHREAD)
+t_poll_LDADD = $(gpg_error_lib) $(LIBMULTITHREAD)
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 783d64f..07b554c 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -36,23 +35,51 @@
VPATH = @srcdir@
-am__make_dryrun = \
- { \
- am__dry=no; \
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
- echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
- | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
- *) \
- for am__flg in $$MAKEFLAGS; do \
- case $$am__flg in \
- *=*|--*) ;; \
- *n*) am__dry=yes; break;; \
- esac; \
- done;; \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
esac; \
- test $$am__dry = yes; \
- }
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -72,21 +99,23 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
TESTS = t-version$(EXEEXT) t-strerror$(EXEEXT) t-syserror$(EXEEXT) \
- t-lock$(EXEEXT)
+ t-lock$(EXEEXT) t-printf$(EXEEXT) t-poll$(EXEEXT) \
+ t-b64dec$(EXEEXT)
noinst_PROGRAMS = $(am__EXEEXT_1)
subdir = tests
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
- $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+ $(top_srcdir)/build-aux/depcomp $(noinst_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
- $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
- $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
- $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
- $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
- $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
- $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/configure.ac
+ $(top_srcdir)/m4/estream.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/threadlib.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
@@ -94,15 +123,28 @@ CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
am__EXEEXT_1 = t-version$(EXEEXT) t-strerror$(EXEEXT) \
- t-syserror$(EXEEXT) t-lock$(EXEEXT)
+ t-syserror$(EXEEXT) t-lock$(EXEEXT) t-printf$(EXEEXT) \
+ t-poll$(EXEEXT) t-b64dec$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
+t_b64dec_SOURCES = t-b64dec.c
+t_b64dec_OBJECTS = t-b64dec.$(OBJEXT)
+t_b64dec_LDADD = $(LDADD)
+t_b64dec_DEPENDENCIES = $(gpg_error_lib)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
t_lock_SOURCES = t-lock.c
t_lock_OBJECTS = t-lock.$(OBJEXT)
am__DEPENDENCIES_1 =
t_lock_DEPENDENCIES = $(gpg_error_lib) $(am__DEPENDENCIES_1)
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
+t_poll_SOURCES = t-poll.c
+t_poll_OBJECTS = t-poll.$(OBJEXT)
+t_poll_DEPENDENCIES = $(gpg_error_lib) $(am__DEPENDENCIES_1)
+t_printf_SOURCES = t-printf.c
+t_printf_OBJECTS = t-printf.$(OBJEXT)
+t_printf_LDADD = $(LDADD)
+t_printf_DEPENDENCIES = $(gpg_error_lib)
t_strerror_SOURCES = t-strerror.c
t_strerror_OBJECTS = t-strerror.$(OBJEXT)
t_strerror_LDADD = $(LDADD)
@@ -115,6 +157,18 @@ t_version_SOURCES = t-version.c
t_version_OBJECTS = t-version.$(OBJEXT)
t_version_LDADD = $(LDADD)
t_version_DEPENDENCIES = $(gpg_error_lib)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
am__depfiles_maybe = depfiles
@@ -127,32 +181,67 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo " CC " $@;
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo " CCLD " $@;
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = t-lock.c t-strerror.c t-syserror.c t-version.c
-DIST_SOURCES = t-lock.c t-strerror.c t-syserror.c t-version.c
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = t-b64dec.c t-lock.c t-poll.c t-printf.c t-strerror.c \
+ t-syserror.c t-version.c
+DIST_SOURCES = t-b64dec.c t-lock.c t-poll.c t-printf.c t-strerror.c \
+ t-syserror.c t-version.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
@@ -166,6 +255,7 @@ AWK = @AWK@
BUILD_FILEVERSION = @BUILD_FILEVERSION@
BUILD_REVISION = @BUILD_REVISION@
BUILD_TIMESTAMP = @BUILD_TIMESTAMP@
+BUILD_VERSION = @BUILD_VERSION@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CC_FOR_BUILD = @CC_FOR_BUILD@
@@ -213,6 +303,7 @@ LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTHREAD = @LIBTHREAD@
LIBTOOL = @LIBTOOL@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
@@ -309,10 +400,12 @@ top_srcdir = @top_srcdir@
@HAVE_W32CE_SYSTEM_FALSE@extra_includes =
@HAVE_W32CE_SYSTEM_TRUE@extra_includes = -idirafter $(top_builddir)/src/gpg-extra
gpg_error_lib = ../src/libgpg-error.la
-INCLUDES = -I$(top_builddir)/src $(extra_includes)
+AM_CPPFLAGS = -I$(top_builddir)/src $(extra_includes)
+AM_LDFLAGS = -no-install
LDADD = $(gpg_error_lib)
noinst_HEADERS = t-common.h
t_lock_LDADD = $(gpg_error_lib) $(LIBMULTITHREAD)
+t_poll_LDADD = $(gpg_error_lib) $(LIBMULTITHREAD)
all: all-am
.SUFFIXES:
@@ -356,15 +449,31 @@ clean-noinstPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
+
+t-b64dec$(EXEEXT): $(t_b64dec_OBJECTS) $(t_b64dec_DEPENDENCIES) $(EXTRA_t_b64dec_DEPENDENCIES)
+ @rm -f t-b64dec$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(t_b64dec_OBJECTS) $(t_b64dec_LDADD) $(LIBS)
+
t-lock$(EXEEXT): $(t_lock_OBJECTS) $(t_lock_DEPENDENCIES) $(EXTRA_t_lock_DEPENDENCIES)
@rm -f t-lock$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_lock_OBJECTS) $(t_lock_LDADD) $(LIBS)
+
+t-poll$(EXEEXT): $(t_poll_OBJECTS) $(t_poll_DEPENDENCIES) $(EXTRA_t_poll_DEPENDENCIES)
+ @rm -f t-poll$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(t_poll_OBJECTS) $(t_poll_LDADD) $(LIBS)
+
+t-printf$(EXEEXT): $(t_printf_OBJECTS) $(t_printf_DEPENDENCIES) $(EXTRA_t_printf_DEPENDENCIES)
+ @rm -f t-printf$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(t_printf_OBJECTS) $(t_printf_LDADD) $(LIBS)
+
t-strerror$(EXEEXT): $(t_strerror_OBJECTS) $(t_strerror_DEPENDENCIES) $(EXTRA_t_strerror_DEPENDENCIES)
@rm -f t-strerror$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_strerror_OBJECTS) $(t_strerror_LDADD) $(LIBS)
+
t-syserror$(EXEEXT): $(t_syserror_OBJECTS) $(t_syserror_DEPENDENCIES) $(EXTRA_t_syserror_DEPENDENCIES)
@rm -f t-syserror$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_syserror_OBJECTS) $(t_syserror_LDADD) $(LIBS)
+
t-version$(EXEEXT): $(t_version_OBJECTS) $(t_version_DEPENDENCIES) $(EXTRA_t_version_DEPENDENCIES)
@rm -f t-version$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(t_version_OBJECTS) $(t_version_LDADD) $(LIBS)
@@ -375,7 +484,10 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-b64dec.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-lock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-poll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-printf.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-strerror.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-syserror.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-version.Po@am__quote@
@@ -385,14 +497,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -407,26 +519,15 @@ mostlyclean-libtool:
clean-libtool:
-rm -rf .libs _libs
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -438,15 +539,11 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -455,6 +552,21 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
@@ -469,7 +581,7 @@ check-TESTS: $(TESTS)
if test -f ./$$tst; then dir=./; \
elif test -f $$tst; then dir=; \
else dir="$(srcdir)/"; fi; \
- if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
all=`expr $$all + 1`; \
case " $(XFAIL_TESTS) " in \
*[\ \ ]$$tst[\ \ ]*) \
@@ -690,9 +802,9 @@ uninstall-am:
.MAKE: check-am install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
- clean-generic clean-libtool clean-noinstPROGRAMS ctags \
- distclean distclean-compile distclean-generic \
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+ clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dvi install-dvi-am install-exec \
@@ -702,7 +814,7 @@ uninstall-am:
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
- tags uninstall uninstall-am
+ tags tags-am uninstall uninstall-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/tests/t-b64dec.c b/tests/t-b64dec.c
new file mode 100644
index 0000000..aae208b
--- /dev/null
+++ b/tests/t-b64dec.c
@@ -0,0 +1,123 @@
+/* t-b64dec.c - b64dec test.
+ Copyright (C) 2017 g10 Code GmbH
+
+ This file is part of libgpg-error.
+
+ libgpg-error is free software; you can redistribute it 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.
+
+ libgpg-error is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with libgpgme-error; if not, write to the Free
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <gpg-error.h>
+
+static const char *test_b64_string = "bGliZ3BnLWVycm9yIGlzIGZyZWUgc29"
+ "mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgd"
+ "W5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIEx"
+ "pY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb"
+ "247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXI"
+ "gb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4=";
+
+static const char *test_string = "libgpg-error is free software; "
+ "you can redistribute it 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.";
+
+#define fail(a) do { fprintf (stderr, "%s:%d: test %d failed\n",\
+ __FILE__,__LINE__, (a)); \
+ errcount++; \
+ } while(0)
+
+static int errcount;
+
+static gpg_error_t
+test_b64dec_string (const char *string, const char *expected)
+{
+ gpg_error_t err;
+ gpgrt_b64state_t state;
+ char *buffer;
+ size_t len;
+
+ len = strlen (string);
+ buffer = malloc (strlen (string) + 1);
+ if (!buffer)
+ {
+ err = gpg_error_from_syserror ();
+ return err;
+ }
+
+ state = gpgrt_b64dec_start ("");
+ if (!state)
+ {
+ err = gpg_error_from_syserror ();
+ free (buffer);
+ return err;
+ }
+
+ err = gpgrt_b64dec_proc (state, buffer, len, &len);
+ if (err)
+ {
+ if (gpg_err_code (err) != GPG_ERR_EOF)
+ {
+ free (buffer);
+ free (state);
+ return err;
+ }
+ }
+
+ err = gpgrt_b64dec_finish (state);
+ if (err)
+ {
+ free (buffer);
+ return err;
+ }
+
+ if (strncmp (buffer, expected, len) == 0)
+ err = 0;
+ else
+ err = GPG_ERR_INTERNAL;
+
+ free (buffer);
+ return err;
+}
+
+
+
+int
+main (int argc, char **argv)
+{
+ gpg_error_t err;
+
+ (void)argc;
+ (void)argv;
+
+ err = test_b64dec_string (test_b64_string, test_string);
+
+ if (err)
+ {
+ fail (1);
+ return 1;
+ }
+ else
+ return 0;
+}
diff --git a/tests/t-common.h b/tests/t-common.h
index 85bcd51..e11bca9 100644
--- a/tests/t-common.h
+++ b/tests/t-common.h
@@ -14,7 +14,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
@@ -24,6 +24,9 @@
#ifndef PGM
# error Macro PGM not defined.
#endif
+#ifndef DIM
+# define DIM(array) (sizeof (array) / sizeof (*array))
+#endif
static int verbose;
diff --git a/tests/t-lock.c b/tests/t-lock.c
index 190d63e..6add18b 100644
--- a/tests/t-lock.c
+++ b/tests/t-lock.c
@@ -1,5 +1,5 @@
/* t-lock.c - Check the lock functions
- * Copyright (C) 2013 g10 Code GmbH
+ * Copyright (C) 2013, 2015 g10 Code GmbH
*
* This file is part of libgpg-error.
*
@@ -14,7 +14,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#if HAVE_CONFIG_H
@@ -25,10 +25,15 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <sys/types.h>
+#include <unistd.h>
#ifdef _WIN32
# include <windows.h>
+# include <time.h>
#else
-# include <pthread.h>
+# ifdef USE_POSIX_THREADS
+# include <pthread.h>
+# endif
#endif
#define PGM "t-lock"
@@ -78,7 +83,7 @@ init_accounts (void)
}
-/* Check that the sum of all accounts matches the intial sum. */
+/* Check that the sum of all accounts matches the initial sum. */
static void
check_accounts (void)
{
@@ -102,6 +107,7 @@ print_accounts (void)
}
+#if defined(_WIN32) || defined(USE_POSIX_THREADS)
/* Get a a random integer value in the range 0 to HIGH. */
static unsigned int
get_rand (int high)
@@ -110,7 +116,7 @@ get_rand (int high)
}
-/* Pick a random account. Note that this fucntion is not
+/* Pick a random account. Note that this function is not
thread-safe. */
static int
pick_account (void)
@@ -132,7 +138,7 @@ static THREAD_RET_TYPE
revision_thread (void *arg)
{
gpg_err_code_t rc;
- int i;
+ int i = 0;
(void)arg;
@@ -187,6 +193,7 @@ accountant_thread (void *arg)
}
return THREAD_RET_VALUE;
}
+#endif /*_WIN32||USE_POSIX_THREADS*/
static void
@@ -231,6 +238,7 @@ run_test (void)
CloseHandle (rthread);
#else /*!_WIN32*/
+# ifdef USE_POSIX_THREADS
pthread_t rthread;
pthread_t athreads[N_ACCOUNTANTS];
int i;
@@ -250,7 +258,11 @@ run_test (void)
stop_revision_thread = 1;
pthread_join (rthread, NULL);
show ("revision thread has terminated");
-
+# else /*!USE_POSIX_THREADS*/
+ verbose++;
+ show ("no thread support - skipping test\n", PGM);
+ verbose--;
+# endif /*!USE_POSIX_THREADS*/
#endif /*!_WIN32*/
gpgrt_lock_destroy (&accounts_lock);
diff --git a/tests/t-poll.c b/tests/t-poll.c
new file mode 100644
index 0000000..ec79416
--- /dev/null
+++ b/tests/t-poll.c
@@ -0,0 +1,440 @@
+/* t-poll.c - Check the poll function
+ * Copyright (C) 2015 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+/* FIXME: We need much better tests that this very basic one. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#ifdef _WIN32
+# include <windows.h>
+# include <time.h>
+#else
+# ifdef USE_POSIX_THREADS
+# include <pthread.h>
+# endif
+#endif
+
+#define PGM "t-poll"
+
+#include "t-common.h"
+
+#ifdef _WIN32
+# define THREAD_RET_TYPE DWORD WINAPI
+# define THREAD_RET_VALUE 0
+#else
+# define THREAD_RET_TYPE void *
+# define THREAD_RET_VALUE NULL
+#endif
+
+
+/* Object to convey data to a thread. */
+struct thread_arg
+{
+ const char *name;
+ estream_t stream;
+ volatile int stop_me;
+#ifdef USE_POSIX_THREADS
+ pthread_t thread;
+#elif _WIN32
+ HANDLE thread;
+#endif
+};
+
+
+static struct thread_arg peer_stdin; /* Thread to feed the stdin. */
+static struct thread_arg peer_stdout; /* Thread to feed the stdout. */
+static struct thread_arg peer_stderr; /* Thread to feed the stderr. */
+
+static estream_t test_stdin;
+static estream_t test_stdout;
+static estream_t test_stderr;
+
+#if defined(_WIN32) || defined(USE_POSIX_THREADS)
+
+/* This thread feeds data to the given stream. */
+static THREAD_RET_TYPE
+producer_thread (void *argaddr)
+{
+ struct thread_arg *arg = argaddr;
+ int i = 0;
+
+ (void)arg;
+
+ while (!arg->stop_me && i++ < 3)
+ {
+ show ("thread '%s' about to write\n", arg->name);
+ es_fprintf (arg->stream, "This is '%s' count=%d\n", arg->name, i);
+ es_fflush (arg->stream);
+ }
+ es_fclose (arg->stream);
+ return THREAD_RET_VALUE;
+}
+
+/* This thread eats data from the given stream. */
+static THREAD_RET_TYPE
+consumer_thread (void *argaddr)
+{
+ struct thread_arg *arg = argaddr;
+ char buf[15];
+
+ (void)arg;
+
+ while (!arg->stop_me)
+ {
+ show ("thread '%s' ready to read\n", arg->name);
+ if (!es_fgets (buf, sizeof buf, arg->stream))
+ {
+ show ("Thread '%s' received EOF or error\n", arg->name);
+ break;
+ }
+ show ("Thread '%s' got: '%s'\n", arg->name, buf);
+ }
+ es_fclose (arg->stream);
+ return THREAD_RET_VALUE;
+}
+
+#endif /*_WIN32 || USE_POSIX_THREADS */
+
+
+static void
+launch_thread (THREAD_RET_TYPE (*fnc)(void *), struct thread_arg *th)
+{
+ int fd;
+
+ th->stop_me = 0;
+ fd = es_fileno (th->stream);
+#ifdef _WIN32
+
+ th->thread = CreateThread (NULL, 0, fnc, th, 0, NULL);
+ if (!th->thread)
+ die ("creating thread '%s' failed: rc=%d", th->name, (int)GetLastError ());
+ show ("thread '%s' launched (fd=%d)\n", th->name, fd);
+
+#elif USE_POSIX_THREADS
+
+ if (pthread_create (&th->thread, NULL, fnc, th))
+ die ("creating thread '%s' failed: %s\n", th->name, strerror (errno));
+ show ("thread '%s' launched (fd=%d)\n", th->name, fd);
+
+# else /* no thread support */
+
+ verbose++;
+ show ("no thread support - skipping test\n", PGM);
+ verbose--;
+
+#endif /* no thread support */
+}
+
+
+static void
+join_thread (struct thread_arg *th)
+{
+#ifdef _WIN32
+ int rc;
+
+ rc = WaitForSingleObject (th->thread, INFINITE);
+ if (rc == WAIT_OBJECT_0)
+ show ("thread '%s' has terminated\n", th->name);
+ else
+ fail ("waiting for thread '%s' failed: %d", th->name, (int)GetLastError ());
+ CloseHandle (th->thread);
+
+#elif USE_POSIX_THREADS
+
+ pthread_join (th->thread, NULL);
+ show ("thread '%s' has terminated\n", th->name);
+
+#endif
+}
+
+
+static void
+create_pipe (estream_t *r_in, estream_t *r_out)
+{
+ gpg_error_t err;
+ int filedes[2];
+
+#ifdef _WIN32
+ if (_pipe (filedes, 512, 0) == -1)
+#else
+ if (pipe (filedes) == -1)
+#endif
+ {
+ err = gpg_error_from_syserror ();
+ die ("error creating a pipe: %s\n", gpg_strerror (err));
+ }
+
+ show ("created pipe [%d, %d]\n", filedes[0], filedes[1]);
+
+ *r_in = es_fdopen (filedes[0], "r,pollable");
+ if (!*r_in)
+ {
+ err = gpg_error_from_syserror ();
+ die ("error creating a stream for a pipe: %s\n", gpg_strerror (err));
+ }
+
+ *r_out = es_fdopen (filedes[1], "w,pollable");
+ if (!*r_out)
+ {
+ err = gpg_error_from_syserror ();
+ die ("error creating a stream for a pipe: %s\n", gpg_strerror (err));
+ }
+}
+
+
+static void
+test_poll (void)
+{
+ int ret;
+ gpgrt_poll_t fds[3];
+ char buffer[16];
+ size_t used, nwritten;
+ int c;
+
+ memset (fds, 0, sizeof fds);
+ fds[0].stream = test_stdin;
+ fds[0].want_read = 1;
+ fds[1].stream = test_stdout;
+ fds[1].want_write = 1;
+ /* FIXME: We don't use the next stream at all. */
+ fds[2].stream = test_stderr;
+ fds[2].want_write = 1;
+ fds[2].ignore = 1;
+
+
+ used = 0;
+ while (used || !fds[0].ignore)
+ {
+ ret = gpgrt_poll (fds, DIM(fds), -1);
+ if (ret == -1)
+ {
+ fail ("gpgrt_poll failed: %s\n", strerror (errno));
+ continue;
+ }
+ if (!ret)
+ {
+ fail ("gpgrt_poll unexpectedly timed out\n");
+ continue;
+ }
+
+ show ("gpgrt_poll detected %d events\n", ret);
+ if (debug)
+ show ("gpgrt_poll: r=%d"
+ " 0:%c%c%c%c%c%c%c%c%c%c%c%c"
+ " 1:%c%c%c%c%c%c%c%c%c%c%c%c"
+ " 2:%c%c%c%c%c%c%c%c%c%c%c%c"
+ "\n",
+ ret,
+ fds[0].want_read? 'r':'-',
+ fds[0].want_write? 'w':'-',
+ fds[0].want_oob? 'o':'-',
+ fds[0].want_rdhup? 'h':'-',
+ fds[0].ignore? '!':'=',
+ fds[0].got_read? 'r':'-',
+ fds[0].got_write? 'w':'-',
+ fds[0].got_oob? 'o':'-',
+ fds[0].got_rdhup? 'h':'-',
+ fds[0].got_hup? 'H':' ',
+ fds[0].got_err? 'e':' ',
+ fds[0].got_nval? 'n':' ',
+
+ fds[1].want_read? 'r':'-',
+ fds[1].want_write? 'w':'-',
+ fds[1].want_oob? 'o':'-',
+ fds[1].want_rdhup? 'h':'-',
+ fds[1].ignore? '!':'=',
+ fds[1].got_read? 'r':'-',
+ fds[1].got_write? 'w':'-',
+ fds[1].got_oob? 'o':'-',
+ fds[1].got_rdhup? 'h':'-',
+ fds[1].got_hup? 'H':' ',
+ fds[1].got_err? 'e':' ',
+ fds[1].got_nval? 'n':' ',
+
+ fds[2].want_read? 'r':'-',
+ fds[2].want_write? 'w':'-',
+ fds[2].want_oob? 'o':'-',
+ fds[2].want_rdhup? 'h':'-',
+ fds[2].ignore? '!':'=',
+ fds[2].got_read? 'r':'-',
+ fds[2].got_write? 'w':'-',
+ fds[2].got_oob? 'o':'-',
+ fds[2].got_rdhup? 'h':'-',
+ fds[2].got_hup? 'H':' ',
+ fds[2].got_err? 'e':' ',
+ fds[2].got_nval? 'n':' '
+ );
+ else
+ show ("gpgrt_poll detected %d events\n", ret);
+
+ if (fds[0].got_read)
+ {
+ /* Read from the producer. */
+ for (;;)
+ {
+ c = es_fgetc (fds[0].stream);
+ if (c == EOF)
+ {
+ if (es_feof (fds[0].stream))
+ {
+ show ("reading '%s': EOF\n", peer_stdin.name);
+ fds[0].ignore = 1; /* Not anymore needed. */
+ peer_stdin.stop_me = 1; /* Tell the thread to stop. */
+ }
+ else if (es_ferror (fds[0].stream))
+ {
+ fail ("error reading '%s': %s\n",
+ peer_stdin.name, strerror (errno));
+ fds[0].ignore = 1; /* Disable. */
+ peer_stdin.stop_me = 1; /* Tell the thread to stop. */
+ }
+ else
+ show ("reading '%s': EAGAIN\n", peer_stdin.name);
+ break;
+ }
+ else
+ {
+ if (used <= sizeof buffer -1)
+ buffer[used++] = c;
+ if (used == sizeof buffer)
+ {
+ show ("throttling reading from '%s'\n", peer_stdin.name);
+ fds[0].ignore = 1;
+ break;
+ }
+ }
+ }
+ show ("read from '%s': %zu bytes\n", peer_stdin.name, used);
+ if (used)
+ fds[1].ignore = 0; /* Data to send. */
+ }
+ if (fds[1].got_write)
+ {
+ if (used)
+ {
+ ret = es_write (fds[1].stream, buffer, used, &nwritten);
+ show ("result for writing to '%s': ret=%d, n=%zu, nwritten=%zu\n",
+ peer_stdout.name, ret, used, nwritten);
+ if (!ret)
+ {
+ assert (nwritten <= used);
+ /* Move the remaining data to the front of buffer. */
+ memmove (buffer, buffer + nwritten,
+ sizeof buffer - nwritten);
+ used -= nwritten;
+ }
+ ret = es_fflush (fds[1].stream);
+ if (ret)
+ fail ("Flushing for '%s' failed: %s\n",
+ peer_stdout.name, strerror (errno));
+ }
+ if (!used)
+ fds[1].ignore = 1; /* No need to send data. */
+ }
+
+ if (used < sizeof buffer / 2 && !peer_stdin.stop_me && fds[0].ignore)
+ {
+ show ("accelerate reading from '%s'\n", peer_stdin.name);
+ fds[0].ignore = 0;
+ }
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int last_argc = -1;
+
+ if (argc)
+ {
+ argc--; argv++;
+ }
+ while (argc && last_argc != argc )
+ {
+ last_argc = argc;
+ if (!strcmp (*argv, "--help"))
+ {
+ puts (
+"usage: ./t-poll [options]\n"
+"\n"
+"Options:\n"
+" --verbose Show what is going on\n"
+" --debug Flyswatter\n"
+);
+ exit (0);
+ }
+ if (!strcmp (*argv, "--verbose"))
+ {
+ verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--debug"))
+ {
+ verbose = debug = 1;
+ argc--; argv++;
+ }
+ }
+
+ if (!gpg_error_check_version (GPG_ERROR_VERSION))
+ {
+ die ("gpg_error_check_version returned an error");
+ errorcount++;
+ }
+
+ peer_stdin.name = "stdin producer";
+ create_pipe (&test_stdin, &peer_stdin.stream);
+ peer_stdout.name = "stdout consumer";
+ create_pipe (&peer_stdout.stream, &test_stdout);
+ peer_stderr.name = "stderr consumer";
+ create_pipe (&peer_stderr.stream, &test_stderr);
+
+ if (es_set_nonblock (test_stdin, 1))
+ fail ("error setting test_stdin to nonblock: %s\n", strerror (errno));
+ if (es_set_nonblock (test_stdout, 1))
+ fail ("error setting test_stdout to nonblock: %s\n", strerror (errno));
+ if (es_set_nonblock (test_stderr, 1))
+ fail ("error setting test_stderr to nonblock: %s\n", strerror (errno));
+
+ launch_thread (producer_thread, &peer_stdin );
+ launch_thread (consumer_thread, &peer_stdout);
+ launch_thread (consumer_thread, &peer_stderr);
+ test_poll ();
+ show ("Waiting for threads to terminate...\n");
+ es_fclose (test_stdin);
+ es_fclose (test_stdout);
+ es_fclose (test_stderr);
+ peer_stdin.stop_me = 1;
+ peer_stdout.stop_me = 1;
+ peer_stderr.stop_me = 1;
+ join_thread (&peer_stdin);
+ join_thread (&peer_stdout);
+ join_thread (&peer_stderr);
+
+ return errorcount ? 1 : 0;
+}
diff --git a/tests/t-printf.c b/tests/t-printf.c
new file mode 100644
index 0000000..7fba012
--- /dev/null
+++ b/tests/t-printf.c
@@ -0,0 +1,429 @@
+/* t-printf.c - Check the estream printf fucntions.
+ * Copyright (C) 2013 g10 Code GmbH
+ *
+ * This file is part of libgpg-error.
+ *
+ * libgpg-error is free software; you can redistribute it 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.
+ *
+ * libgpg-error is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+
+/* Note that these tests check against glibc behaviour. On non glibc
+ systems expect non matching return codes in some border cases. */
+
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <locale.h>
+
+#define PGM "t-printf"
+
+#include "t-common.h"
+
+
+static char *one_test_buf1;
+static int one_test_rc1;
+
+static void
+one_test_x0 (const char *format, ...)
+{
+ va_list arg_ptr;
+
+ show ("format: ->%s<-\n", format);
+
+ errno = ENOENT; /* For the "%m" test. */
+ va_start (arg_ptr, format);
+#ifdef HAVE_VASPRINTF
+ one_test_rc1 = vasprintf (&one_test_buf1, format, arg_ptr);
+#else
+ one_test_rc1 = -1;
+#endif
+ va_end (arg_ptr);
+ if (one_test_rc1 == -1)
+ {
+ fail (" sys: errno=%d (%s)\n", errno, strerror (errno));
+ one_test_buf1 = NULL;
+ }
+ else
+ show (" sys: ->%s<-\n", one_test_buf1);
+}
+
+static void
+one_test_x1 (const char *format, ...)
+{
+ int rc2;
+ va_list arg_ptr;
+ char *buf2;
+
+ errno = ENOENT;
+ va_start (arg_ptr, format);
+ rc2 = gpgrt_vasprintf (&buf2, format, arg_ptr);
+ va_end (arg_ptr);
+ if (rc2 == -1)
+ {
+ fail (" our: errno=%d (%s)\n", errno, strerror (errno));
+ }
+ else
+ show (" our: ->%s<-\n", buf2);
+
+ if (one_test_rc1 != -1 && rc2 != -1 && strcmp (one_test_buf1, buf2))
+ {
+ fail ("error: output does not match\n"
+ "format: ->%s<-\n sys: ->%s<-\n our: ->%s<-\n",
+ format, one_test_buf1, buf2);
+ }
+ else if ( one_test_rc1 != rc2 )
+ {
+ fail ("error: return codes are different: sys_rc=%d our_rc=%d\n",
+ one_test_rc1, rc2);
+ }
+
+ free (buf2);
+}
+
+static void
+one_test_x2 (const char *format, ...)
+{
+ va_list arg_ptr;
+ char *buf2;
+
+ /* Test once more using the bsprintf variant. */
+ errno = ENOENT;
+ va_start (arg_ptr, format);
+ buf2 = gpgrt_vbsprintf (format, arg_ptr);
+ va_end (arg_ptr);
+ if (!buf2)
+ {
+ fail (" our(2): errno=%d (%s)\n", errno, strerror (errno));
+ }
+ else if (verbose)
+ show (" our: ->%s<-\n", buf2);
+
+ if (one_test_rc1 != -1 && buf2 && strcmp (one_test_buf1, buf2))
+ {
+ fail ("error: output does not match\n"
+ "format(2): ->%s<-\n sys: ->%s<-\n our: ->%s<-\n",
+ format, one_test_buf1, buf2);
+ }
+ es_free (buf2);
+
+ free (one_test_buf1);
+ one_test_buf1 = NULL;
+}
+
+
+#define one_test_0(a) \
+ one_test_x0 (a); \
+ one_test_x1 (a); \
+ one_test_x2 (a)
+#define one_test_1(a, b) \
+ one_test_x0 (a, b); \
+ one_test_x1 (a, b); \
+ one_test_x2 (a, b)
+#define one_test_2(a, b, c) \
+ one_test_x0 (a, b, c); \
+ one_test_x1 (a, b, c); \
+ one_test_x2 (a, b, c)
+#define one_test_3(a, b, c, d) \
+ one_test_x0 (a, b, c, d); \
+ one_test_x1 (a, b, c, d); \
+ one_test_x2 (a, b, c, d)
+
+static void
+run_tests (void)
+{
+#ifndef HAVE_VASPRINTF
+ /* We do not have a system vasprintf. */
+ show ("run-tests: disabled due to missing vasprintf.\n");
+#else /*HAVE_VASPRINTF */
+
+ /*one_test ("%d %% %'d", 17, 19681977);*/
+
+ one_test_2 ("%d %% %d", 17, 768114563);
+ one_test_2 ("%d %% %d", 17, -768114563);
+
+ one_test_1 ("%d", 17);
+ one_test_1 ("%4d", 17);
+ one_test_1 ("%40d", 17);
+ one_test_1 ("%-d", 17);
+ one_test_1 ("%-4d", 17);
+ one_test_1 ("%-140d", 17);
+ one_test_1 ("%d", -17);
+ one_test_1 ("%4d", -17);
+ one_test_1 ("%40d", -17);
+ one_test_1 ("%-d", -17);
+ one_test_1 ("%-4d", -17);
+ one_test_1 ("%-40d", -17);
+
+ one_test_1 ("%+4d", 17);
+ one_test_1 ("%+4d", -17);
+ one_test_1 ("%-+4d", 17);
+ one_test_1 ("%-+4d", -17);
+ one_test_1 ("% 4d", 17);
+ one_test_1 ("% 4d", -17);
+ one_test_1 ("%- +4d", 17);
+ one_test_1 ("%- +4d", -17);
+
+ one_test_1 ("%.4d", 17);
+ one_test_1 ("%.0d", 17);
+ one_test_1 ("%.0d", 0);
+ one_test_1 ("%.4d", -17);
+ one_test_1 ("%.0d", -17);
+ one_test_1 ("%6.4d", 17);
+ one_test_1 ("%6.4d", -17);
+ one_test_1 ("%6.0d", 0);
+ one_test_1 ("%4.6d", 17);
+ one_test_1 ("%4.6d", -17);
+
+ one_test_1 ("% 4.6d", 17);
+ one_test_1 ("% 6.0d", 0);
+
+ one_test_1 ("%.4d", 17);
+ one_test_1 ("%04d", 17);
+ one_test_1 ("%.4d", -17);
+ one_test_1 ("%04d", -17);
+ one_test_1 ("%0.d", 0);
+
+ one_test_2 ("%*d", 7, 42);
+ one_test_2 ("%*d", -7, 42);
+ one_test_2 ("%.*d", 7, 42);
+ one_test_2 ("%.*d", -7, 42);
+ one_test_3 ("%*.*d", 10, 7, 42);
+ one_test_3 ("%*.*d", 10, -7, 42);
+ one_test_3 ("%*.*d", -10, 7, 42);
+ one_test_3 ("%*.*d", -10, -7, 42);
+
+ one_test_2 ("%*x", 7, 42);
+ one_test_2 ("%*x", -7, 42);
+ one_test_2 ("%.*x", 7, 42);
+ one_test_2 ("%.*x", -7, 42);
+ one_test_3 ("%*.*x", 10, 7, 42);
+ one_test_3 ("%*.*x", 10, -7, 42);
+ one_test_3 ("%*.*x", -10, 7, 42);
+ one_test_3 ("%*.*x", -10, -7, 42);
+ one_test_2 ("%#*x", 7, 42);
+ one_test_2 ("%#*x", -7, 42);
+ one_test_2 ("%#.*x", 7, 42);
+ one_test_2 ("%#.*x", -7, 42);
+ one_test_3 ("%#*.*x", 10, 7, 42);
+ one_test_3 ("%#*.*x", 10, -7, 42);
+ one_test_3 ("%#*.*x", -10, 7, 42);
+ one_test_3 ("%#*.*x", -10, -7, 42);
+
+ one_test_2 ("%*X", 7, 42);
+ one_test_2 ("%*X", -7, 42);
+ one_test_2 ("%.*X", 7, 42);
+ one_test_2 ("%.*X", -7, 42);
+ one_test_3 ("%*.*X", 10, 7, 42);
+ one_test_3 ("%*.*X", 10, -7, 42);
+ one_test_3 ("%*.*X", -10, 7, 42);
+ one_test_3 ("%*.*X", -10, -7, 42);
+ one_test_2 ("%#*X", 7, 42);
+ one_test_2 ("%#*X", -7, 42);
+ one_test_2 ("%#.*X", 7, 42);
+ one_test_2 ("%#.*X", -7, 42);
+ one_test_3 ("%#*.*X", 10, 7, 42);
+ one_test_3 ("%#*.*X", 10, -7, 42);
+ one_test_3 ("%#*.*X", -10, 7, 42);
+ one_test_3 ("%#*.*X", -10, -7, 42);
+
+ one_test_2 ("%*o", 7, 42);
+ one_test_2 ("%*o", -7, 42);
+ one_test_2 ("%.*o", 7, 42);
+ one_test_2 ("%.*o", -7, 42);
+ one_test_3 ("%*.*o", 10, 7, 42);
+ one_test_3 ("%*.*o", 10, -7, 42);
+ one_test_3 ("%*.*o", -10, 7, 42);
+ one_test_3 ("%*.*o", -10, -7, 42);
+ one_test_2 ("%#*o", 7, 42);
+ one_test_2 ("%#*o", -7, 42);
+ one_test_2 ("%#.*o", 7, 42);
+ one_test_2 ("%#.*o", -7, 42);
+ one_test_3 ("%#*.*o", 10, 7, 42);
+ one_test_3 ("%#*.*o", 10, -7, 42);
+ one_test_3 ("%#*.*o", -10, 7, 42);
+ one_test_3 ("%#*.*o", -10, -7, 42);
+
+ one_test_1 ("%s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.0s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.10s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.48s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.49s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.50s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%.51s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%48s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%49s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%50s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%51s", "the quick brown fox jumps over the lazy dogs back");
+ one_test_1 ("%-51s", "the quick brown fox jumps over the lazy dogs back");
+
+ one_test_1 ("/%s=", "CN");
+
+ one_test_1 ("%f", 3.1415926535);
+ one_test_1 ("%f", -3.1415926535);
+ one_test_1 ("%.10f", 3.1415926535);
+ one_test_1 ("%.2f", 3.1415926535);
+ one_test_1 ("%.1f", 3.1415926535);
+ one_test_1 ("%.0f", 3.1415926535);
+ one_test_1 ("%.20f", 3.1415926535);
+ one_test_1 ("%10.10f", 3.1415926535);
+ one_test_1 ("%10.2f", 3.1415926535);
+ one_test_1 ("%10.1f", 3.1415926535);
+ one_test_1 ("%10.0f", 3.1415926535);
+ one_test_1 ("%30.20f", 3.1415926535);
+ one_test_1 ("%10.10f", -3.1415926535);
+ one_test_1 ("%10.2f", -3.1415926535);
+ one_test_1 ("%10.1f", -3.1415926535);
+ one_test_1 ("%10.0f", -3.1415926535);
+ one_test_1 ("%30.20f", -3.1415926535);
+
+ one_test_1 ("%-10f", 3.1415926535);
+ one_test_1 ("%-10.10f", 3.1415926535);
+ one_test_1 ("%-10.2f", 3.1415926535);
+ one_test_1 ("%-10.1f", 3.1415926535);
+ one_test_1 ("%-10.0f", 3.1415926535);
+ one_test_1 ("%-30.20f", 3.1415926535);
+ one_test_1 ("%-10f", -3.1415926535);
+ one_test_1 ("%-10.10f", -3.1415926535);
+ one_test_1 ("%-10.2f", -3.1415926535);
+ one_test_1 ("%-10.1f", -3.1415926535);
+ one_test_1 ("%-10.0f", -3.1415926535);
+ one_test_1 ("%-30.20f", -3.1415926535);
+
+ one_test_1 ("%#.0f", 3.1415926535);
+ one_test_1 ("%#10.0f", 3.1415926535);
+ one_test_1 ("%#10.0f", -3.1415926535);
+ one_test_1 ("%-#10.0f", 3.1415926535);
+ one_test_1 ("%-#10.0f", -3.1415926535);
+
+ one_test_1 ("%e", 3.1415926535);
+ one_test_1 ("%g", 3.1415926535);
+
+ one_test_1 ("%a", 1.0);
+ one_test_1 ("%a", -1.0);
+ one_test_1 ("%a", 3.1415926535);
+
+#ifdef HAVE_LONG_DOUBLE
+ one_test_1 ("%La", (long double)1.0);
+ one_test_1 ("%La", (long double)-1.0);
+ one_test_1 ("%La", (long double)3.1415926535);
+#endif
+
+#ifdef __GLIBC__
+ /* "%m" is a glibc extension so this _test_ will only work on such a
+ system. */
+ one_test_0 ("%m");
+ one_test_1 ("%d=%m", 17);
+ one_test_2 ("%2$d:%m:%1$d", 42, 17);
+#endif /*__GLIBC__*/
+
+#endif /*HAVE_VASPRINTF */
+}
+
+static void
+check_snprintf (void)
+{
+ char buffer[20];
+ int rc, rc2;
+ size_t tmplen, blen, blen2;
+
+ rc = gpgrt_snprintf (buffer, 0, "%*s", 18, "");
+ if (rc != 18)
+ printf ("rc=%d\n", rc );
+ rc = gpgrt_snprintf (buffer, sizeof buffer, "%*s", 18, "");
+ if (rc != 18)
+ printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
+ rc = gpgrt_snprintf (buffer, sizeof buffer, "%*s", 19, "");
+ if (rc != 19)
+ printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
+ rc = gpgrt_snprintf (buffer, sizeof buffer, "%*s", 20, "");
+ if (rc != 20)
+ printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
+ rc = gpgrt_snprintf (buffer, sizeof buffer, "%*s", 21, "");
+ if (rc != 21)
+ printf ("rc=%d, strlen(buffer)=%d\n", rc, (int)strlen (buffer));
+
+ for (tmplen = 0; tmplen <= sizeof buffer; tmplen++)
+ {
+ rc = gpgrt_snprintf (buffer, tmplen, "%04d%02d%02dT%02d%02d%02d",
+ 1998, 9, 7, 16, 56, 05);
+ blen = strlen (buffer);
+ rc2 = snprintf (buffer, tmplen, "%04d%02d%02dT%02d%02d%02d",
+ 1998, 9, 7, 16, 56, 05);
+ blen2 = strlen (buffer);
+ if (rc != rc2 || blen != blen2)
+ printf ("snprintf test with len %u gives %d instead of %d (%u,%u)\n",
+ (unsigned int)tmplen, rc, rc2,
+ (unsigned int)blen, (unsigned int)blen2);
+ }
+}
+
+
+
+int
+main (int argc, char **argv)
+{
+ int last_argc = -1;
+
+ if (argc)
+ {
+ argc--; argv++;
+ }
+ while (argc && last_argc != argc )
+ {
+ last_argc = argc;
+ if (!strcmp (*argv, "--help"))
+ {
+ puts (
+"usage: ./" PGM " [options]\n"
+"\n"
+"Options:\n"
+" --verbose Show what is going on\n"
+" --debug Flyswatter\n"
+);
+ exit (0);
+ }
+ if (!strcmp (*argv, "--verbose"))
+ {
+ verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--debug"))
+ {
+ verbose = debug = 1;
+ argc--; argv++;
+ }
+ }
+
+ setlocale (LC_NUMERIC, "");
+ if (!gpg_error_check_version (GPG_ERROR_VERSION))
+ {
+ die ("gpg_error_check_version returned an error");
+ errorcount++;
+ }
+
+ run_tests ();
+ check_snprintf ();
+
+#ifdef __GLIBC__
+ return !!errorcount;
+#else
+ return 0;
+#endif
+}
diff --git a/tests/t-strerror.c b/tests/t-strerror.c
index e02b302..9289066 100644
--- a/tests/t-strerror.c
+++ b/tests/t-strerror.c
@@ -2,17 +2,17 @@
Copyright (C) 2003 g10 Code GmbH
This file is part of libgpg-error.
-
+
libgpg-error is free software; you can redistribute it 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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpgme-error; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
diff --git a/tests/t-syserror.c b/tests/t-syserror.c
index 25de86f..a4cb983 100644
--- a/tests/t-syserror.c
+++ b/tests/t-syserror.c
@@ -2,17 +2,17 @@
Copyright (C) 2006 g10 Code GmbH
This file is part of libgpg-error.
-
+
libgpg-error is free software; you can redistribute it 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.
-
+
libgpg-error is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
-
+
You should have received a copy of the GNU Lesser General Public
License along with libgpgme-error; if not, write to the Free
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
@@ -38,6 +38,9 @@ main (int argc, char *argv[])
int save_errno;
gpg_err_code_t ec;
+ (void)argc;
+ (void)argv;
+
fp = fopen ("/does-not-exist/110761/nowhere.foo", "r");
if (fp)
{
diff --git a/tests/t-version.c b/tests/t-version.c
index d6c6399..4606dbc 100644
--- a/tests/t-version.c
+++ b/tests/t-version.c
@@ -14,7 +14,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
@@ -82,7 +82,7 @@ main (int argc, char **argv)
}
if (gpg_error_check_version ("15"))
{
- fprintf (stderr, "gpg_error_check_version did not return an error"
+ fprintf (stderr, "%s: gpg_error_check_version did not return an error"
" for a newer version\n", logpfx);
errorcount++;
}